Javascript AngularJS:使用$compile将html附加到网页

Javascript AngularJS:使用$compile将html附加到网页,javascript,html,angularjs,angular-directive,Javascript,Html,Angularjs,Angular Directive,我有一个动态网页,它是由用户以前的条目生成的。这意味着要浏览一个可能的输入列表,然后将它们附加到指令中的html中 因此,我的ng标记都可以工作,我需要通过$compile运行这一大块html,以便它们仍然可以工作。这已经很好地工作了,我现在的问题是,我正在尝试执行更复杂的字段,这些字段使用自定义指令或jquery类,这些类在通过$compile后拒绝正常运行 例如— <div data-j-signature="obj.Test" data-pen-color="#0000ff" dat

我有一个动态网页,它是由用户以前的条目生成的。这意味着要浏览一个可能的输入列表,然后将它们附加到指令中的html中

因此,我的ng标记都可以工作,我需要通过$compile运行这一大块html,以便它们仍然可以工作。这已经很好地工作了,我现在的问题是,我正在尝试执行更复杂的字段,这些字段使用自定义指令或jquery类,这些类在通过$compile后拒绝正常运行

例如—

<div data-j-signature="obj.Test" data-pen-color="#0000ff" data-line-color="#00000" style="border:1px #000 solid;"></div><div class="col-sm-11">
这使用jquery日期选择器,正常情况下可以正常工作,但在我的指令中被追加然后编译时就不行了

这才是你问题的核心。您不能期望jQuery插件在Angular应用程序中正常工作,因为它们的生命周期不是很好。我会解释得更好

运行应用程序时,一些带有指令和绑定Angular的HTML将由Angular解析和编译。这个我很好。此时,jQuery插件甚至可能会正确初始化,因为它们通常只需要呈现DOM。然而,当您附加新编译的动态HTML时会发生什么?Angular将很好地拾取它,因为您调用了
$compile
。但是jQuery可能会失去同步,并且永远不会重新初始化插件

这就是为什么不应该像我们习惯的那样使用jQuery的主要原因。理想情况下,jQuery的使用(以及通常的DOM操作)应该仅限于自定义指令。这是100%确保Angular和jQuery在正确的时刻更新/初始化其内容的唯一方法

所以。。你需要一个约会挑选员吗?伟大的有许多Angular指令(例如datepicker)可以简单地将jQuery插件包装到链接函数中,从而使其与Angular工作流和摘要周期兼容。

app.controller('mainController',函数($scope,$http,$compile){
$scope.updateData=函数(){
$http({
方法:“张贴”,
网址:abc.com,
数据:angular.element('#form').serialize(),
标题:{'Content-Type':'application/x-www-form-urlencoded'}
}).
然后(函数(结果){
var temp=$compile(result.data)($scope);
angular.element('#showhtml').html(temp);
}).catch(函数(响应){
}).最后(函数(){
});
}

});谁创建了datepicker实例?指令还是初始化脚本?嗨,我把datepicker从我的帖子中删除了,因为我认为它更适合显示一个角度不合适的示例。
jsignation
也是jQuery。如果你在它周围包装一个指令,那可能期望元素已经存在于DOM中,但是你在编译后插入它。啊,是的。。。我只是在想指令,而不是图书馆。在进一步检查这一点之后,它确实首先命中了jsignature指令,然后在我的指令中编译,然后进入jquery jsignature库。你认为把编译推迟到最后可能会解决这个问题吗?谢谢你提供的信息。我确实计划摆脱jquery,所以也许我应该使用一个角度不合适的例子,我会更新我的帖子。如果你有任何建议,请编辑我的帖子:)
<div ng-repeat="Question in Questions">
    <question-type></question-type>
</div>
var compiledHtml = $compile(stringOfHtml)(scope);
element.append(compiledHtml);