角度ng重复导致孤立的范围

时间:2013-10-04 15:41:29

标签: javascript angularjs

我可以使用帮助来理解如何使这两个示例以相同的方式工作。对于初学者,这是我的完整示例:http://jsfiddle.net/tylerbrinks/DZbfD/

我正在使用一个简单的控制器来管理索引。我意识到这不是100%必要的,但是我将一个更大的问题简化为最基本的部分以求帮助。控制器如下所示:

function TabCtrl($scope){
    $scope.index = 0;
}

我正在使用索引值来维护列表中的哪个项目(如标签页)。

当元素已经存在于DOM中时,它们的行为与我期望的完全一样。单击每个项目可切换选择的项目。在JsFiddle中,颜色会更改以显示所选项目。

<div ng-controller="TabCtrl">
    <div ng-class="{selected: index == 0}" ng-click="index = 0">Click Me. Position is 0, scope.index is {{index}}</div>
    <div ng-class="{selected: index == 1}" ng-click="index = 1">Click Me. Position is 1, scope.index is {{index}}</div>
    <div ng-class="{selected: index == 2}" ng-click="index = 2">Click Me. Position is 2, scope.index is {{index}}</div>
</div>

那是完美的 - 表现得像我一样。我的问题是我有一个动态列表,我正在使用 ng-repeat 来构建它。当我这样做时, ng-repeat 似乎为列表中的每个项目赋予了新的范围。这意味着我无法在它们之间切换,因为它们不共享相同的索引属性。相反,每个列表项都有自己的范围,每个范围都有唯一的索引值。

这是同样的事情,但使用ng-repeat。我没有在点击时对索引进行硬编码,而是将其设置为转发器的$ index属性。

<div ng-controller="TabCtrl">
    <div  ng-repeat="item in [1,2,3]" ng-class="{selected: index == $index}" ng-click="index = $index">Click Me.  Position is: {{$index}}, scope.index is {{index}}</div> 
</div>

如何让动态列表共享一个像静态列表一样的范围?

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

您可以在父作用域中创建对象,以便可以使用子作用域中的值。像这样:

Fiddle

function TabCtrl($scope){
    $scope.myVariables = { index : 0 };
}

<div ng-controller="TabCtrl">
    <div ng-repeat="item in [1,2,3]" ng-class="{selected: myVariables.index == $index}" ng-click="myVariables.index = $index">Click Me.  Position is: {{$index}}, myVariables.index is {{myVariables.index}}</div> 
</div>

答案 1 :(得分:1)

因为为列表中的每个项创建了一个新范围,所以您对index的分配将在每个新范围中创建一个新变量;实质上,列表中的每个项目都有自己的索引变量副本。

相反,将索引声明为父范围的子字段:

function TabCtrl($scope){
    $scope.container = {
      index: 0
    }
}

然后在你曾经引用索引的所有地方引用HTML中的container.index。

我使用规则,所有对范围变量的HTML引用都应包含'。' - 如果他们没有,那么我可能已经违反了范围规则。

答案 2 :(得分:1)

是的,你必须像我所说的其他人一样在你父母的范围内。我个人喜欢使用函数

所以在您的控制器中:

  $scope.activate= function(index){
      $scope.index=index;
  };

然后ng-class:

ng-class="{ active:index=={{$index}}}"

和ng-click:

ng-click="activate({{$index}})"