![](/img/trans.png)
[英]Angularjs ng-repeat does not update after changing $scope variable
[英]AngularJS: variable in ng-repeat without $scope is in its local scope?
这是代码:
<ul>
<li ng-repeat="i in items" ng-class="{'red': click}">
<span ng-click="click = !click">{{i}}</span>
</li>
</ul>
<ul>
<li ng-repeat="j in items" ng-class="{'red': f_click}">
<span ng-click="fun_click($index)">{{j}}</span>
</li>
</ul>
f_click
改变fun_click
函数。
$scope.fun_click = (idx) ->
$scope.f_click = !$scope.f_click
完整的代码: http : //plnkr.co/edit/Zmoqbv?p = preview
我想知道第一个列表中的变量click
是每个ng-repeat元素的局部变量吗?
它是如何工作的?
我怎么能让第二个列表中的f_click
像click
一样工作?
似乎$scope.f_click
是ng-controller中唯一的一个变量。
更新:
我想我做错了。
我不应该在“视图”中写东西。
在View中只读;
只读在Controller中。
http://www.jacopretorius.net/2013/07/angularjs-best-practices.html
如何让第二个列表中的f_click像点击一样工作
据我所知你不能。 从您的第一个示例click
不引用任何范围。
f_click
指的是特定范围,任何更改都会分布在所有元素上(也就是循环中的所有项目)
您可以为每个值提供标记,如:
$scope.items2 = [
{'name': 'Google','value':false},
{'name': 'Apple','value':false},
{'name': 'Yahoo','value':false},
{'name': 'IBM','value':false},
];
$scope.fun_click = (item) ->
item.value = !item.value;
HTML
<ul>
<li ng-repeat="j in items2" ng-class="{'red': j.value}">
<span ng-click="fun_click(j)">{{j.name}}</span>
</li>
</ul>
ng-repeat
为每次迭代创建一个范围。 click
变量存在于每个ng-repeat
范围内,换句话说,它是私有的。 如果您在<body ng-controller="MainCtrl">
但在ng-repeat
之前放置{{click}}
,它将不会显示任何内容,因为内部作用域中存在click
。
另一方面, f_click
存在于MainCtrl
的范围内, MainCtrl
是两个ng-repeat
的父范围。 更改它的功能( fun_click
)也存在于父作用域中。 ng-repeat
范围继承此变量的单个实例 ,从而继承观察到的行为。
要使f_click
作为click
工作,您必须将其设置为每个ng-repeat
迭代范围的私有。 一种解决方案是在 ng-repeat
内的控制器中定义f_click
和fun_click()
。 其他解决方案也是可能
首先ngRepeat工作的原因和第二个不工作的原因是因为ngRepeat为每个项目创建了一个范围。 换句话说,存在的情况下, click
在每个项目变量items
,并通过切换click
变量ngClick里面你实际上是与私有实例工作。 在第二个示例中,您使用控制器的$scope
访问f_click
,该控制器是ngRepeat范围的父级,因此更改将传播到所有子范围。
因此,对您的问题的简单解决方案是将在f_click
创建的f_click
实例传递给您的函数:
// Script
$scope.fun_click = (toggle) ->
return !toggle
// HTML
<span ng-click="f_click=fun_click(f_click)">{{j}}</span>
如果您希望在$scope
维护状态,可以使用字典来跟踪每个$index
的状态:
// Script
$scope.form_status = {}
$scope.fun_click = (index) ->
$scope.form_status[index] = !$scope.form_status[index]
// HTML
<li ng-repeat="j in items" ng-class="{'red': form_status[$index]}">
<span ng-click="fun_click($index)">{{j}}</span>
</li>
这里有更新的plunker: http ://plnkr.co/edit/w6RLed?p = preview
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.