是否可以$编译HTML文档,而不是$compile
期望的元素?
问题我正在尝试解决:我在外部.html文件中有可打印的表单,我想要包含这一行:<link rel="stylesheet" type="text/css" href="styles.css">
现在我不能这样做,因为$compile
期望element
参数,哪一个是DOM元素,不能包含(或简单忽略到样式表的链接)。
模板我有:
<div>
<span ng-bind="model.tasks.count"></span>
</div>
模板,我想拥有(我的主要目标 - 将样式提取到单独的文件中):
<html>
<head>
<link href="/app/style.css" rel="stylesheet">
</head>
<body>
<div>
<span ng-bind="model.tasks.count"></span>
</div>
</body>
</html>
我的代码示例:
return $q.all([ getTemplate(), getScope() ]).then(
function(msg) {
var element = angular.element(msg[0]); // Now it's DOM element
$compile(element)(msg[1]); // If i pass HTML document, element goes undefined
openWindow(element);
});
和openWindow:
function openWindow(element) {
$timeout(function () {
var html = element.html();
var _w = window.open();
_w.document.body.innerHTML = html; // Here i'd like to write complete HTML doc
_w.print();
});
}
答案 0 :(得分:0)
是否可以$编译HTML文档,而不是像$ compile这样的元素 期望?
这不是真的正确,$compile
期待任何事情,您可以将整个html作为字符串传递给angular.element
或$compile
。但答案仍然是否定的,$compile
使用了jqLite:
if (!($compileNodes instanceof jqLite)) {
// jquery always rewraps, whereas we need to preserve the original selector so that we can
// modify it.
$compileNodes = jqLite($compileNodes);
}
// We can not compile top level text elements since text nodes can be merged and we will
// not be able to attach scope data to them, so we will wrap them in <span>
forEach($compileNodes, function(node, index) {
if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) /* non-empty */ ) {
$compileNodes[index] = jqLite(node).wrap('<span></span>').parent()[0];
}
});
jqLite会像h jQuery()
一样处理html文档 - 作为<head>
和<body
的顶级元素的集合。当然,$compile
并不打算编译整个文档。
如果您在模板中使用了样式后,可以使用<style type="text/css">@import url("...")</style>
。