0

我有以下带有自定义指令“my-repeater”的代码:

<div ng-controller="AngularCtrl">
  <div my-repeater='{{items}}'>Click here</div>
</div>​

这是我的自定义指令:

myApp.directive('myRepeater', function($compile) {
  return {
    restrict: 'A',
    link: function(scope, element, attrs) {
        var myTemplate = "<div ng-click='updateRating({{item}});' ng-class='getRatingClass({{rating}});'>{{rating}}</div>";
            var items = scope.items;
            console.log('length: ' + items.length);
            for (var i = 0; i < items.length; i++) {
                var child = scope.$new(true);
                console.log(items[i].ratings);
                child.item = items[i];
                child.rating = items[i].ratings;                    
                var text = $compile(myTemplate)(child);
                element.append(text);
            }
   }
};

});

ng-clickng-class绑定在我的自定义指令中没有正确发生。谁能帮我解决我在这里做错的事情?

这是 JS 小提琴。 http://jsfiddle.net/JSWorld/4Yrth/5/

4

2 回答 2

6

嗨,我已将您的示例更新为我认为您想要做的。

http://jsfiddle.net/46Get/2/

  • 首先,在这样的指令ng-click='updateRating({{item}});'中接收一个表达式,您不需要使用'{{}}',因为它已经在范围内执行。

  • 其次,当您需要在指令中添加兄弟姐妹时,您需要在编译阶段而不是链接阶段进行,或者只使用 ng-repeat

于 2012-12-29T11:27:53.090 回答
2

我添加.ng-scope { border: 1px solid red; margin: 2px}到@rseidi 的答案/小提琴中,我发现 $compile 服务正在为模板中的每个项目创建一个范围 - 即每个<div>. 由于您要显示的项目太多,我认为更少的范围会更好。在尝试了一堆不同的东西之后,我发现 Angular 似乎为每个“顶级”元素创建了一个新的范围。所以一个解决方案是创建一个外部 div - 即确保只有一个“顶级”元素:

var mainTpl = '<div>';  // add this line
...
for(...) { }
mainTpl += '</div>';    // add this line

小提琴

现在,只有外部 div 创建了一个范围,因为现在只有一个“顶级”元素,而不是每个项目一个。

于 2012-12-29T19:18:30.630 回答