在$compile后,HTML按钮显示为文本。
在$compile后,HTML按钮显示为文本。
这个问题已经有答案了:
我正在尝试使用Angular的JS代码创建具有两个按钮的弹出对话框。以下代码生成按钮...
var html = $(''); var div = $compile(html); var content = div($scope); document.getElementById('dialogboxhead').innerHTML = "header"; document.getElementById('dialogboxbody').innerHTML = "body"; document.getElementById('dialogboxfoot').innerHTML = content;
但是,它给我提供的是下面的HTML文本而不是实际的按钮...
[[object HTMLButtonElement], [object Text], [object HTMLButtonElement]]
我是否遗漏了什么,忘记添加了什么?
HTML看起来如下...
admin 更改状态以发布 2023年5月20日
这种方式混合使用AngularJS和jQuery并不明智。
这种方法的主要问题是$compile将watchers添加到指定的作用域中。这些watchers将在从DOM中删除后仍保留。这将导致内存泄漏。如果这是一个经常添加和删除的对话框 - 请注意。
但是如果你必须使用,不要使用innerHTML
来附加编译后的内容:
̶d̶o̶c̶u̶m̶e̶n̶t̶.̶g̶e̶t̶E̶l̶e̶m̶e̶n̶t̶B̶y̶I̶d̶(̶'̶d̶i̶a̶l̶o̶g̶b̶o̶x̶f̶o̶o̶t̶'̶)̶.̶i̶n̶n̶e̶r̶H̶T̶M̶L̶ ̶=̶ ̶c̶o̶n̶t̶e̶n̶t̶;̶ var foot = document.getElementById('dialogboxfoot'); $(foot).append(content);
DEMO演示
angular.module("app",[]) .controller("ctrl",function($scope, $compile) { var html = $(' '); var div = $compile(html); var content = div($scope); document.getElementById('dialogboxhead').innerHTML = "header"; document.getElementById('dialogboxbody').innerHTML = "body"; var foot = document.getElementById('dialogboxfoot'); $(foot).append(content); })
$compile
方法接受一个字符串参数,如果你想以这种方式提供标记。
避免用任何东西(如$(..)
)包装$compile的输入。相反,直接将html字符串传递给$compile()
方法,同时通过DOM append()
方法附加div
,你会发现这将按预期工作:
var html = ''; var div = $compile(html); ... document.getElementById('dialogboxfoot').append( div[0] );
有关更多信息,请参见官方文档中的用法。
这里是一个链接到一个可工作的jsFiddle