更改控制器中ng-repeat中定义的变量的状态

时间:2015-02-27 00:24:03

标签: javascript angularjs toggle angularjs-ng-repeat

我想知道是否可以从控制器更改ng-repeat中定义的变量的值?

我试图初始化一个简单的变量"打开"用于在控制器内部进行ng-repeat切换。

<div ng-repeat="item in list">
    <input type="checkbox" ng-model="active[$index]" ng-click="active[$index]?opened=true:''" />
    <a href ng-click="opened=!opened"><span class="glyphicon" ng-class="opened ? 'glyphicon-triangle-bottom' : 'glyphicon-triangle-right'"></span></a>
{{item.title}}  
    <span ng-show="opened">{{item.title}}</span>    
</div>

这是一个展示示例的plunker。 http://plnkr.co/edit/lebA2dokhq2W4AsbjKWB?p=preview

谢谢,

2 个答案:

答案 0 :(得分:2)

简单的答案是否定的,因为您的控制器无法访问该范围。

您可以从控制器访问的$ scope对象是您的“根”范围。像ng-repeat这样的指令创建了自己的子范围,它们“继承”了它们的祖先,这意味着它们可以访问它们的变量。父作用域无法访问子作用域。

然而,有一个技巧。

您必须在根范围(在控制器上)定义变量,然后您可以在ng-repeat范围内定义新属性。

像这样:

<div ng-repeat="item in list">
    <input type="checkbox" ng-model="active[$index]" ng-click="active[$index]?opened=true:''" />
    <a href ng-click="option.opened=!option.opened"><span class="glyphicon" ng-class="option.opened ? 'glyphicon-triangle-bottom' : 'glyphicon-triangle-right'"></span></a>
    {{item.title}}  
    <span ng-show="option.opened">{{item.title}}</span>    
</div>

在您的控制器中,确保创建此对象:     $scope.options = {}

答案 1 :(得分:1)

我以这种方式解决了我的问题:

在js控制器上声明:

$scope.opened = [];

在html中的项目上放了:

ng-click="opened[$index].valor = (rotateImg[$index] = !rotateImg[$index])"

在img类上:

ng-class="opened[$index].valor ? 'rotate': ''"

CSS就是:

.rotate {
    -ms-transform: rotate(180deg);
    -webkit-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -webkit-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    transform: rotate(180deg);
}