在ng-repeat中通过ng-click调用的赋值表达式的行为

时间:2013-03-13 14:39:11

标签: angularjs angularjs-scope

我正在尝试使用附加到ng-click的{​​{1}}来更新我的模型。

我对<p> 之外的赋值表达式没有问题,或者在ng-repeat内调用范围方法 。但是,如果我在ng-repeat内部使用 ,它似乎会被忽略。我没有在Firefox控制台中看到任何消息报告,但是没有尝试设置断点以查看事件是否被触发。

ng-repeat

小提琴是here,如果你愿意的话(以及一些早期的变种)。

2 个答案:

答案 0 :(得分:78)

指令ngRepeat为每次迭代创建一个新范围,因此您需要在父范围内引用您的变量。

使用$parent.selected = value,如:

<p ng-repeat='value in values' ng-click='$parent.selected = value'>{{value}}</p>

注意:函数调用由于原型继承而传播。

如果您想了解更多信息:The Nuances of Scope Prototypal Inheritance

答案 1 :(得分:21)

正如@Stewie所提到的,$ parent是解决这个问题的一种方法。但是,推荐的(by the Angular team)解决方案是不在$ scope上定义原始属性。相反,$ scope应该引用您的模型。使用引用也避免了这个问题(因为不会在隐藏/隐藏同名父作用域属性的子作用域上创建基本属性),并且您不必记住何时使用$ parent:

HTML:

<p>Selected = {{model.selected}}</p>
<hr/>
<p ng-click='model.selected = defaultValue'>Click me</p>
<hr/>
<p ng-repeat='value in values' ng-click='model.selected = value'>{{value}}</p>
<hr/>
<p ng-repeat='value in values' ng-click='doSelect(value)'>{{value}}</p>

JavaScript的:

$scope.model = { selected: ""};
...
$scope.doSelect = function (val) {
   $scope.model.selected = val;
}

Fiddle

我最近更新了@Stewie提到的维基页面,总是推荐这种方法。