当类更改时,ng-class 会在 AngularJs 视图中更新 ng-repeat 中的所有项目

Posted

技术标签:

【中文标题】当类更改时,ng-class 会在 AngularJs 视图中更新 ng-repeat 中的所有项目【英文标题】:ng-class updates all items in ng-repeat in AngularJs view when class is changed 【发布时间】:2017-10-30 01:05:46 【问题描述】:

我试图仅将 AngularJs 的 ng-class 应用于单击的特定项目,但无论我将 ng-class="class" 放在哪里,每次更新类时,它都会应用于 @987654326 中的所有项目@指令。

有趣:我原以为用data-target="#collapse_ $index 加上它只会改变具有相同$index 的对应项? :(

我做错了什么?

我怎样才能让类更改只应用于被点击的特定项目?我想创建一个用户可以选择和取消选择一行的东西。

这是一个非常相似的帖子,但我不确定如何根据我的需要来实现:Only add class to specific ng-repeat in AngularJS

他是我要更改的标题的基本 HTML:

<div class="panel-heading">
    <div class="container-fluid panel-container item-container">
        <div class="col-xs-1 text-left">
            <h4>
                <a data-toggle="collapse" data-target="#collapse_ $index ">
                    <span class="glyphicon glyphicon-list"></span>
                </a>
            </h4>
        </div>
        <div class="col-xs-8 text-left product-header">
            <a data-toggle="collapse" data-target="#collapse_ $index ">
                <span>Product Name: product.productName</span>
            </a>
        </div>
        <div class="col-xs-3 text-right">
            <span class="panel-title btn-group">
                <button type="button" id="button-selected" class="btn btn-default btn-sm abc" ng-click="addProduct(product)" ng-class="class">
                    <span class="glyphicon glyphicon-plus text-primary"></span>
                </button>
            </span>
        </div>
    </div>
</div>

这是我的 CSS:

.active-product 
    background: red;
    color: green;


.inactive-product 
    background: none;
    color: none;

这是我的控制器方法(由addProduct 函数调用):

$scope.class = "inactive-product";

function changeClass() 
    if ($scope.class === "active-product")
        $scope.class = "inactive-product";
    else
        $scope.class = "active-product";
;

这是一个如何更改每个项目的示例:

【问题讨论】:

【参考方案1】:

问题是你正在更新数组中所有元素的类,所以你可以做一个解决这个问题的方法是放置一个 ng-click 事件来切换一个额外的属性并指示当前对象是否被选中

<div ng-repeat='item in productList' >
   <p ng-class='item.selected ? "active" : "default"' ng-click='toggleActive($index)'>item.id</p>
</div>

最后在控制器中基于 index 或另一个 property 的函数(如果您愿意),更改选定的属性

$scope.toggleActive = function ()
 //Makes only the clicked object have      the selected attribute in true

【讨论】:

感谢您的洞察力。也是一个很好的解决方案。【参考方案2】:

只有一个$scope.class,所以每个元素都在使用它是有道理的。每个产品可能需要一个 class 属性:

模板:

ng-class="product.class"

控制器:

function changeClass(product) 
    if (product.class === "active-product")
        product.class = "inactive-product";
    else
        product.class = "active-product";
;

【讨论】:

非常感谢!当你想到它时,这很合乎逻辑。你真的帮了我很多忙! :D 不客气。一次只能有一个活动项目吗?如果是这样,您可能只需要存储活动项目的索引。如果是这样,我可以更新我的答案。

以上是关于当类更改时,ng-class 会在 AngularJs 视图中更新 ng-repeat 中的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

随着模型的变化,Angular ng-class 三元组不会更新我的模板

如何使用 ng-class 更改背景颜色?

javascript Angular ng-class

ng-class 在值更改时未正确更新

动态更改 Angular 指令元素属性

AngularJS ng-class 添加类但在更改时不删除它