这是代码:
<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 重复元素的局部变量?
它是如何工作的?
如何使第二个列表中的f_click
像click
一样工作?
似乎$scope.f_click
是ng控制器中唯一的变量。
更新:
我想我只是做错了事情。
我不应该在"视图"中写东西。
在视图中只读;
在控制器中只写。
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
范围内,换句话说,它是私有的。如果将{{click}}
放在<body ng-controller="MainCtrl">
之后但在ng-repeat
之前,它将不显示任何内容,click
因为它存在于内部作用域中。
另一方面,f_click
生活在MainCtrl
的范围内,这是两个ng-repeat
的父作用域。更改它的函数(fun_click
)也存在于父作用域中。ng-repeat
作用域继承此变量的单个实例,从而继承观察到的行为。
要使f_click
按click
工作,您必须将其设置为每个ng-repeat
迭代范围的私有。一种解决方案是在ng-repeat
内部的控制器中定义f_click
和fun_click()
。其他解决方案也是可能的。
第一个ngRepeat有效而第二个无效的原因是ngRepeat为每个项目创建了一个范围。 换句话说,items
中的每个项目都有一个click
变量的实例,通过在ngClick中切换click
变量,您实际上是在使用私有实例。 在第二个示例中,使用控制器(ngRepeat 作用域的父级)$scope
访问f_click
,因此更改将传播到所有子作用域。
因此,问题的简单解决方案是在 ngRepeat 中创建的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