AngularJS:使用ng Repeat和ng Init从列表中删除项目

时间:2014-05-13 15:18:28

标签: javascript angularjs angularjs-ng-repeat

我使用ngRepeat显示列表中的项目。根据文档的建议,我使用ngInit将$ index变量赋值给我在循环内引用的“itemIndex”变量。每个项目都显示一个按钮,允许我从列表中删除它。 Here是jsfiddle的一个例子:

<li ng-repeat="item in list" ng-init="itemIndex = $index"> {{itemIndex}} {{item}} <a href="#" ng-click="removeItem(itemIndex)">remove</a></li>

如果我尝试删除某个项目,则不会更新itemIndex变量,因此后续删除操作将失败。相反,如果我使用$ index变量,一切都按预期工作(here是没有ngInit-ed变量的相同示例):

<li ng-repeat="item in list">{{$index}} - {{item}} <a href="#" ng-click="removeItem($index)">remove</a></li>

这是一个错误还是预期的行为?

1 个答案:

答案 0 :(得分:2)

此行为是有意的,ng-init只是故意运行一次。

当您查看ngInit指令(https://github.com/angular/angular.js/blob/master/src/ng/directive/ngInit.js)时,您可以看到传递给ng-init的脚本的$eval是在compile函数中完成的,而不是link功能。

var ngInitDirective = ngDirective({
  priority: 450,
  compile: function() {
    return {
      pre: function(scope, element, attrs) {
        scope.$eval(attrs.ngInit);
      }
    };
  }
});

编译只在您的应用程序生命周期中执行一次,而每次指令link到元素/您的文档时都会执行链接。