繁体   English   中英

具有动态templateUrl和Transclude的Angular指令

[英]Angular directive with dynamic templateUrl and Transclude

这是问题所在。 我需要将directive2传递给directive1。 Directive1有一个动态templateUrl。 模板有一个部分可以托管被转换的代码(另一个指令)。 除非我用$ timeout包围element.find(下面),否则这不起作用。 呈现页面后,该指令将嵌入到模板中。 但是如果没有超时,我无法让它工作。

<directive1>
  <directive2></directive>
</directive1>

指令1

app.directive("directive1", function() {
    return {
        replace: true,
        transclude: true,
        template: '<ng-include src="getTemplateUrl()" />',
        scope: {
            id: "="
        },
        link: function (scope, element, attrs, controller, transclude) {
            scope.getTemplateUrl = function () {
                return "template" + scope.id + ".html";
            };

            element.find(".placeholderForDirective2").append(transclude());

        }
    }
})

模板1:

<div>
    <div class="placeholderForDirective2"></div>
    <div>blah blah blah</div>
</div>

ngInclude提供了几个在加载模板时通知的选项。

您可以使用onload属性在加载模板时计算表达式:

<ng-include src="getTemplateUrl()" onload="myFunction()" />

它还会发出您可以侦听的事件,特别是$includeContentLoaded事件。

scope.$on('$includeContentLoaded', myFunction);

这是绝对期望的: ng-include是异步的,而link函数中的代码是同步的。 Angular有时间获取"template" + scope.id + ".html" 之前element.find()肯定会运行。

您可以监听ng-include'$includeContentLoaded'事件,然后调用element.find()

scope.$on('$includeContentLoaded', function() {
    element.find(".placeholderForDirective2").append(transclude());
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM