Angularjs $compile和Angular中指令上的compile函数之间的差异?
我试图使用我构建的存储库检索指令的模板,该存储库返回解析为模板内容的承诺 在指令中使用Angularjs $compile和Angular中指令上的compile函数之间的差异?,angularjs,Angularjs,我试图使用我构建的存储库检索指令的模板,该存储库返回解析为模板内容的承诺 在指令中使用编译函数与在链接函数中使用$compile服务有什么区别 编译函数 compile: function (element, attrs) { templateRepository.get('Shared/Login').then(function (result) { element.replaceWith(result); }); } 这将呈现HTML,但范围不绑定到DOM元
编译
函数与在链接
函数中使用$compile
服务有什么区别
编译函数
compile: function (element, attrs) {
templateRepository.get('Shared/Login').then(function (result) {
element.replaceWith(result);
});
}
这将呈现HTML,但范围不绑定到DOM元素
使用$compile
link: function (scope, elem, attrs) {
templateRepository.get('Shared/Login').then(function (result) {
elem.html(result);
$compile(elem.contents())(scope);
});
}
这正如预期的那样有效
这里的区别是什么?我认为,编译函数更灵活一些: 从文档: 编译函数的返回值可以是 功能或对象 返回(post链接)函数-相当于注册 当 编译函数为空 返回通过pre和post注册函数的对象 属性-允许您控制何时应使用链接函数 在链接阶段调用。请参阅有关预链接和 后链接功能如下 : 将HTML字符串或DOM编译为模板并生成模板 函数,然后可用于链接作用域和模板 一起 编译是遍历DOM树并匹配DOM的过程 指令的元素 因此,
$compile
对交给它的任何DOM元素进行角度处理
在$compile
期间,运行所有找到的指令中的编译函数。请注意,每个指令的编译函数只执行一次,而不管该指令有多少个实例
当执行$compile
生成的模板函数(“将作用域和模板链接在一起”)时,将执行每个指令的链接函数(将作用域作为第一个参数传入)
因此,$compile
转换DOM。而指令的编译函数是在转换过程中为该指令运行的
这里有一个小例子,你可以用它来演示执行的顺序 因此指令
compile
函数不链接到作用域,只根据指令及其所附加的元素创建一个模板?如果为true,则使用$compile
服务是执行我所需操作的正确方法?此compiledResult=$compile(elem.contents())
不针对作用域进行链接。此compiledResult(范围)
或$compile(elem.contents())(范围)
不起作用。因此,$compile
本身没有链接,但是对作用域执行它返回的函数(模板函数)会链接。但是还要注意的是,$compile
没有执行结果模板函数都不会将元素添加到dom中。您可以拥有一个尚未在DOM上的已编译元素,反之亦然。解释得很好!!将其添加到DOM是在elem.html(result)
correct?中完成的,在编译中执行此操作有两个问题。第一,正如您提到的,编译函数中没有可用的作用域。对于一个指令,compile只调用一次——不管它有多少个实例。这就像是指令的构造函数。因此,使用compile函数,您不能拥有具有不同html的指令的多个副本。