2013-03-14 92 views
10

我有一个模板:AngularJs - 访问DOM元素NG-重复内

<div ng-repeat="friend in friends | filter:filterFriendsHandler"> 
    {{friend.name}} 
</div> 

,并在我的控制,我有:

$scope.filterFriendsHandler = function(friend){ 
    //HERE I WANT TO ACCESS TO FRIEND DOM ELEMENT; to do something like this: 
    //$(friendElement).text('foo'); 
} 

感谢

+0

你需要使用一个指令来做到这一点 – 2013-03-14 17:07:43

+0

请你可以举一些例子来做到这一点,非常感谢你 – Zzarcon 2013-03-14 17:12:08

回答

14

您需要使用directive

<div ng-app="test-app" ng-controller="MyController"> 
    <div ng-repeat="friend in friends" nop> 
     {{friend.title}} 
    </div> 
</div> 

JS

app.directive('nop', function(){ 
    return { 
     link: function(scope, elm){ 
      console.log('eee', elm, arguments); 
      elm.css('color', 'red'); 
     } 
    } 
}); 

演示:Fiddle

+0

这正是我所需要的:D。谢谢Arun! – Zzarcon 2013-03-14 17:22:28

+0

有时候爱得有角度。 – 2015-01-15 18:36:56

18

我要在这里回答的具体问题,是的,我明白这不是做事情的“角”的方式。如果你想以“正确”的方式做事,那么不要这样做,使用指令。在那里,免责声明,以下是如何做到这一点:

基本上,你想要做的是给DOM元素一个基于$ index或在你的ng-repeat对象中的唯一值的ID。在这里,我只使用$ index。

<div ng-repeat="friend in friends" id="friend_{{$index}}" ng-bind-html="doSomethingBadToTheDom('friend_' + $index)"> 
    {{friend.title}} 
</div> 

然后,控制器里面,只是查询DOM与该ID的元素:

$scope.doSomethingBadToTheDom = function(ele_id) { 
    var element = document.getElementById(ele_id); 
    element.innerHTML = "I'm abusing angular"; 
} 

我们正在使用NG绑定,HTML,因为这里的DOM元素会存在,当你的控制器函数执行,在像ng-init之类的情况下,它不会。

同样,这违背了所有的角度代表,所以如果你试图遵循角度最佳实践,不要这样做。

我遇到过这种技术很有用的情况,尤其是在处理非角度库时,或者那些“角度方式”比它更值得的麻烦时。