我正在尝试使用附加到ng-click
的{{1}}来更新我的模型。
我对<p>
的 之外的赋值表达式没有问题,或者在ng-repeat
内调用范围方法 。但是,如果我在ng-repeat
内部使用 ,它似乎会被忽略。我没有在Firefox控制台中看到任何消息报告,但是没有尝试设置断点以查看事件是否被触发。
ng-repeat
小提琴是here,如果你愿意的话(以及一些早期的变种)。
答案 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;
}
我最近更新了@Stewie提到的维基页面,总是推荐这种方法。