如何手动将指令内部转换为2个位置?

时间:2014-07-03 07:50:35

标签: javascript angularjs angularjs-directive

我需要访问ng-repeat的结果,我发现我可以使用transclude函数并手动编译。但问题是它不能使用2个地方并且元素有ng-repeat。我的代码是这样的:

return {
    restrict: 'E',
    require: '?ngModel',
    template: 'HTML'
    transclude: true,
    replace: true,
    link: function(scope, element, attrs, ngModelCtrl, $transclude) {
        var caption = element.find('.caption');
        var dropdown = element.find('.dropdown-menu');
        $transclude(function(clone) {

            //var clone_clone = clone.addClass('ng-hide');
            //$compile(clone.contents())(scope.$new()).appendTo(caption);

            $compile(clone)(scope.$new()).appendTo(dropdown);
            $compile(clone)(scope.$new()).appendTo(caption);
        });
    }
};

当我只运行一次编译但在第二次编译时抛出异常时,我会尝试clone()同时使用contents()transclude: 'element'。我怎样才能做到这一点?我需要与ng-transclude具有相同的行为(ng-translcude不能与ng-repeat一起使用,因为在内部链接中我有一个元素而不是元素列表。)

更新:用法:

<dropdown>
  <li><a>foo</a></li>
  <li><a>bar</a></li>
  <li><a>baz</a></li>
</dropdown>

<dropdown>
  <li ng-repeat="item in items"><a>{{item.label}}</a></li>
</dropdown>

1 个答案:

答案 0 :(得分:0)

所以我需要的是两次调用transclude:

$transclude(function(clone) {
    $compile(clone)(scope.$new()).appendTo(caption);
});
$transclude(function(clone) {
    $compile(clone)(scope.$new()).appendTo(dropdown);
});