簡體   English   中英

指令模板中的動態指令

[英]Dynamic directive from a directive's template

我想基於指令名稱數組在頁面中加載指令。

在我的主頁上:

<div component-loader></div>

指示:

myApp.directive('componentLoader', function($compile) {
    var component = function(scope, element, attrs) {
        $compile(element.contents())(scope);
    }

    return {
        link:           component,
        replace:        true,
        scope:          true,
        template:       '<div ng-repeat="component in components"><div {{component.directive}}></div></div>'
    };
});

范圍:

$scope.components = [{
    directive:  'directive01'
},{
    directive:  'directive02'
}]

我期望的是:

<div directive01></div>
<div directive02></div>

我得到的是:

<div {{component.directive}}></div>
<div {{component.directive}}></div>

我究竟做錯了什么?

謝謝!

綁定僅適用於屬性內容,不適用於屬性名稱(據我所知)。 取而代之的是,您可以使用一個無模板指令,並在鏈接函數中生成元素。

<div component-loader="components"></div>

您的鏈接功能

function(scope, element, attrs) {
    var components = attrs.componentsLoader;
    // Or use scope.components or scope.$parent.components depending on
    // how your scopes are organised

    angular.forEach(components, function (component) {
        element.append(angular.element().attr(component.directive, '');
    });        

    $compile(element.contents())(scope);
}

仍然不是理想的解決方案,但是可以滿足我的要求:

myApp.directive('componentLoader', function($compile) {
    var component = function(scope, element, attrs) {

        scope.$watchCollection('components', function(a, b) {
            var code = '';
            var i;
            for (i=0;i<scope.components.length;i++) {
                code += '<div '+scope.components[i].directive+'></div>'
            }
            element.html($compile(code)(scope));

        });

    }

    return {
        link:           component,
        scope:          true
    };
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM