2

元のコンテンツをトランスクルージョンして解析し、元のコンテンツの情報を使用して新しいコンテンツを構築するディレクティブがあります。その要点は次のようになります。

.directive('list', function() {
    return {
        restrict: 'E',
        transclude: true,
        templateUrl: '...',
        scope: true,
        controller: function($scope, $element, $attrs, $transclude) {
            var items;
            $transclude(function(clone) {
                clone = Array.prototype.slice.call(clone);
                items = clone
                    .filter(function(node) {
                        return node.nodeType === 1;
                    })
                    .map(function(node) {
                        return {
                            value: node.getAttribute('value')
                            text: node.innerHTML
                        };
                    });
            });

            // Do some stuff down here with the item information
        }
    }
});

次に、次のように使用します。

<list>
    <item value="foo">bar</item>
    <item value="baz">qux</item>
</list>

これはすべてこのようにうまく機能します。ng-repeatこの問題は、次のようにディレクティブ コンテンツ内で使用しようとすると発生します。

<list>
    <item ng-repeat="item in items" value="{{ item.value }}">{{ item.text }}</item>
</list>

これをしようとすると、アイテムがありません。なぜこれが機能しないのか、または同じ種類のことを達成するためのより良い方法があるかどうかは誰にも分かりますか?

4

1 に答える 1

2

あなたは試すことができます:

transcludeFn(scope, function (clone) {
   iElem.append(clone);
})

もう少し詳細については:

HTML:

<foo data-lists='[lists data here]'>
 <li ng-repeat="list in lists">{{list.name}}</li>
</foo>

指令:

var Foo = function() {
  return {
     restrict: 'E',
     template: '...'
     transclude: true,
     scope: { lists: '=?' }
     link: function(scope, iElem, iAttrs, Ctrl, transcludeFn) {
          transcludeFn(scope, function (clone) {
              iElem.append(clone);
          }
     }
  };
};

.directive('foo', Foo);

transcludeFn 内で使用するスコープを transcludFn に知らせる必要があります。また、isolate スコープを使用したくない場合は、次のことも試してください。transcludeFn(scope.$parent....)

于 2014-11-26T08:39:07.547 に答える