正确包括Angular指令的模板

时间:2016-03-07 20:36:31

标签: javascript angularjs templates

我正在编写一个需要模板的Angular指令。在Angular中加载模板是通过使用<script type="text/ng-template">将模板本身嵌入到源代码中,或者通过在指令的配置中提供URL来完成的,例如templateUrl: "/path/to/template.html"

第一种方式对于第三方指令是完全不可接受的,因为人们不会npm install我的指令然后执行include("node_modules/mydirective/template.html")(或等效的),它只是感觉很脏。

第二种方式不会出于同样的原因。该模板将位于node_modules目录内,在打包/部署网站后,该目录无法公开访问。

我的想法是允许开发人员以与指令本身相同的方式包含模板:

<script type="text/javascript" src="/path/to/directive.js"></script>
<script type="text/ng-template" src="/path/to/directive.html"></script>

问题是第二行不起作用(浏览器会抱怨意外的字符,我假设因为它仍然试图将获取的内容解析为JS。

我发现使用ng-include代替script src实际上会抓取模板。问题是,在获取模板时,我的指令已经运行link函数并崩溃(因为它找不到模板)。

有没有办法可以延迟我的指令,直到获取模板或提供加载模板的任何理智的方式?

2 个答案:

答案 0 :(得分:0)

使用模板而不是templateUrl进行内联模板怎么样?如果它是一个库,我觉得这是捆绑指令和模板以进行分发的最简单方法

答案 1 :(得分:0)

延迟评估指令的一种方法是编写一个包装指令来执行模板请求,然后$ compile并将初始指令附加到请求回调中的页面。不过,还不是那么漂亮。