是否可以使用有角度的HTML文档进行$编译

时间:2015-04-03 14:23:32

标签: javascript jquery html css angularjs

是否可以$编译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();
    });
}

1 个答案:

答案 0 :(得分:0)

  

是否可以$编译HTML文档,而不是像$ compile这样的元素   期望?

这不是真的正确,$compile期待任何事情,您可以将整个html作为字符串传递给angular.element$compile。但答案仍然是否定的,$compile使用了jqLit​​e:

  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];
    }
  });

jqLit​​e会像h jQuery()一样处理html文档 - 作为<head><body的顶级元素的集合。当然,$compile并不打算编译整个文档。

如果您在模板中使用了样式后,可以使用<style type="text/css">@import url("...")</style>