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的指令的多个副本。