【问题标题】:binding ng directives inside custom directive在自定义指令中绑定 ng 指令
【发布时间】:2012-12-14 08:41:49
【问题描述】:

我有以下带有自定义指令“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 Fiddle。 http://jsfiddle.net/JSWorld/4Yrth/5/

【问题讨论】:

    标签: angularjs javascript-framework


    【解决方案1】:

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

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

    Fiddle

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

    【讨论】:

    • 太棒了!非常感谢马克!
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢 rseidi!但我不想使用 ng-repeat。我面临嵌套 ng-repeats 的问题,因为它会堆积堆内存。因此,我想为 ng-repeat 编写自己的自定义指令,因此我想出了这个。你能帮我在不使用 ng-repeat 的情况下获得这个绑定吗?
    • 嗯,我看不出这种方法比使用 ngRepeat 更好,你一次显示多少项?你真正想做什么?
    • 我有大约 150*150 个项目要显示。所以嵌套的 ng-repeat 对我不起作用。所以我不得不去写一个客户。请参阅此内容以供参考。 stackoverflow.com/questions/14065050/…
    • 我明白了,您可以尝试类似jsfiddle.net/46Get/3 的方法,预先生成模板不要创建子范围并通过索引引用每个项目。这应该会降低堆,但您仍然会创建很多手表。否则,我建议您将所有这些逻辑封装在一个纯 jquery 小部件和一个仅用于集成的指令中。
    • 太棒了!这正是我想要的!非常感谢你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多