如何解决这个ng-class切换比较?

时间:2015-04-24 02:20:41

标签: javascript angularjs angularjs-ng-repeat angularjs-ng-click angularjs-ng-class

http://plnkr.co/edit/7v63GXSIDon1QKm1GXCE?p=preview

我有一个array,它存储了每个点击按钮的名称。单击后,对象将放入数组中,我使用ng-class检查数组中对象的名称是否与用于创建按钮的模型相同。然后,如果是这样,则打开或关闭btn-info课程。

ng-class="{'btn-info': toggleArray[k].name == m.name}"

不确定我的代码有什么问题,但是如果你按照确切的顺序点击按钮,从1到3就可以了。但是一旦你开始随机点击按钮,它就会快速中断。

plnkr example

控制器

.controller('ArrayCtrl', ['$scope', function($scope) {

        // Init ArrayCtrl scope:
        // ---------------------
        var vs         = $scope;
        vs.message     = "Add and remove objects from array:";
        vs.toggleArray = [];
        vs.apiArray    = [{name: 'AAA'}, {name: 'BBB'}, {name: 'CCC'}];

        vs.selectBtn = function(btnObj) {
            var index = vs.toggleArray.indexOf(btnObj);
            if (index !== -1) {
                vs.toggleArray.splice(index, 1);
            } 
            else {
                vs.toggleArray.push(btnObj);
            }
        };

    }
]);

标记

<div class="model-btns">
    <ul>
      <li ng-repeat="(k, m) in apiArray"
          ng-click="selectBtn(m)"
          class="tag-li">
              <button class="btn"
                      ng-class="{'btn-info': toggleArray[k].name == m.name}">
                  {{m.name}}
              </button>
        </li>
    </ul>
  </div>

  <div class="well list-delete">
      <p>List to delete:</p>
      <ul>
          <li ng-repeat="item in toggleArray">
              {{item}}
          </li>
      </ul>
  </div>

1 个答案:

答案 0 :(得分:3)

问题就在这里:ng-class="{'btn-info': toggleArray[k].name == m.name}"

我们说所有按钮都是&#34;关闭&#34;,因此toggleArray[]。您点击第二个按钮,toggleArray将为[ { "name": "BBB" } ]。 但是在该按钮的ng-class表达式中,k将为1.因此toggleArray[1]未定义且表达式永远不为真,除非您先单击第一个项目以使toggleArray具有2元件。

您只需更改:

ng-class="{'btn-info': toggleArray[k].name == m.name}"

为:

ng-class="{'btn-info': toggleArray.indexOf(m) > -1}"

this plnkr所示。