我专门创建此fiddle来解决我的问题。我在某节中ng-repeat
。我有一个要在其中实现的切换功能。但是,当我单击按钮时,将为所有重复项触发功能。当不使用ng-repeat
时,即使单击时使用相同的函数名,此方法也能正常工作。下面是代码。我想这里可以使用类似this
运算符的东西。到目前为止,我的代码(我是为小提琴而非原始语言创建的),
HTML
<div ng-app="app">
<div ng-controller="CommentController">
<div ng-repeat="list in lists">
<button ng-click="showDiv()" class="review">{{lists[$index]}}</button>
<div ng-show="hiddenDiv">This is the div to be toggled on clicking any of the above button. And they do so as they make use of <i>same function on click.</i>
</div>
</div>
</div>
</div>
Controller
var app = angular.module('app', []);
app.controller('CommentController', function ($scope) {
$scope.hiddenDiv = true;
$scope.showDiv = function () {
$scope.hiddenDiv = !$scope.hiddenDiv;
};
$scope.lists = ["one", "two", "three", "four", "five"];
});
最佳答案
如果您需要根据单击的按钮折叠一个特定的重复项,请尝试以下操作,
将按钮修改为
<button ng-click="hiddenDiv = !hiddenDiv" class="review">{{lists[$index]}}</button>
并从 Controller 中删除
$scope.showDiv
函数DEMO FIDDLE
说明
如果你用像
<button ng-click="showDiv()" class="review">{{lists[$index]}}</button>
单击按钮时,将触发 Controller 的
$scope.showDiv
函数,并且该函数中的$scope.hiddenDiv
属性将切换,并且请注意,$ scope.hiddenDiv 对整个 Controller 可见,这意味着它在所有 Controller 范围内都是通用的,因此,如果进行更改一旦使用该属性的所有其他事物都将改变,但是如果使用
<button ng-click="hiddenDiv = !hiddenDiv" class="review">{{lists[$index]}}</button>
那么每一次重复都会有一个
hiddenDiv
属性,因为ng-repeat
正在创建子范围(DOC)。因此,对于一个特定的重复,有一个单独的hiddenDiv
属性,对于其他重复不可见,对于其他重复不可见。如果您使用
<button ng-click="myData.hiddenDiv = !myData.hiddenDiv" class="review">{{lists[$index]}}</button>
请注意,您使用
myData.hiddenDiv
而不是hiddenDiv
,在这种情况下,angular将检查
hiddenDiv
子作用域中myData
对象的ng-repeat
属性,然后angular意识到在子作用域中不存在称为myData
的东西,然后它将在父作用域中进行搜索,并且意识到该属性存在于此,并且该属性为对于所有重复而言都是常见的,例如使用showDiv()
函数。但是,如果您不使用hiddenDiv
,则angular会在子范围内不存在ng-repeat
后,在hiddenDiv
子范围内进行搜索,并创建一个新的子范围变量。请参见原型(prototype)继承。有一个很好的描述here。
并且也请检查this描述