角。如何访问ng-repeat项目范围

时间:2015-02-25 21:14:06

标签: javascript angularjs

代码:

<div ng-controller="someCtrl">
  <span ng-repeat="item in [{id: 1},{id: 2},{id: 3},{id: 4},{id: 5}]"></span>
</div>

使用Javascript:

.controller('someCtrl', function($scope){
  //how to get access to child scope of element with id===3?
  for(var i = 0,len = $('span').length;i<len;i++){
    if($('span').eq(i).scope().id === 3){
      //do something with scope of element with id===3
    }
  }
})

如何在没有DOM操作的情况下访问此范围?

3 个答案:

答案 0 :(得分:1)

在控制器中定义数组。然后您可以轻松访问:

<div ng-controller="someCtrl">
  <span ng-repeat="item in MyList"></span>
</div>

.controller('someCtrl', function($scope){
  $scope.MyList =  [{id: 1},{id: 2},{id: 3},{id: 4},{id: 5}]

  $scope.Mylist[2]...
})

答案 1 :(得分:0)

您正在尝试做的事情,您可以通过在转发器内部轻松实现。

<div ng-controller="someCtrl">
    <span ng-repeat="item in [{id: 1},{id: 2},{id: 3},{id: 4},{id: 5}]">

        <!-- do whatever you want -->

        <!-- do something specific if it's id === 3 -->
        <span ng-if="item.id === 3">
            <strong>{{ item.id }}</strong> 
        </span> 
    </span>
</div>

此外,你永远不会在控制器/服务/工厂内进行DOM操作(Javascript / jQuery /无论如何)。仅在指令内,即使尽量保持最小。

答案 2 :(得分:0)

Disclamer:在实际应用中不使用此代码!

好的,这是可怕的事情,但为了学术兴趣,我将发布如何从控制器获取子范围的答案。

由于ngRepeat为每个呈现的项目创建当前$scope的子范围,所以您需要做的就是阅读$$childHead$first item)并从那里检查{ {1}}范围,直到找到必要的范围对象。

有一点需要注意:您需要在 next 摘要周期中运行对象搜索,因为在摘要控制器执行期间还没有任何渲染。所以您可以使用$$nextSibling服务:

$timeout

演示: http://plnkr.co/edit/KLtTSnrS8lIEejMhKuby?p=preview