2

如何在父母之前优先编译孩子?

例如,假设我有一个编译 Markdown 的指令,并且我想将 Markdown 文件分开。所以,我可以:

<div markdown>
    <ng-include src='"someMarkdownFile.md"'></div>
</div>

问题是我不知道如何让 ng-include 先编译。

我尝试将它们放在同一个元素上并将markdown指令设置为terminal,例如:

<div markdown ng-include src='"someMarkdownFile.md"'></div>

但由于 ng-include 是终端,它永远不会在 markdown 指令之前运行。

这可能吗?

回答

看起来答案是,你不能。Brandon 的回答对我的特殊情况有所帮助,但在 Angular 中似乎没有办法做到这一点。

为了在下面阐述布兰登的回答,我将我的 HTML 更改为:

<div markdown src='someMarkdownFile.md'></div>

并让指令检查src属性。如果存在,请运行:

    $http.get(src, {cache: $templateCache}).success(function(resp) {
      return element.html(resp);
    }).error(function() {
      throw new Error("Could not load " + src + " from markdown directive");
    });
4

1 回答 1

1

有几种方法可以解决这个问题。

首先,每次重新加载其内容时都会ngInclude 发出一个事件:

$includeContentLoaded

每次重新加载 ngInclude 内容时发出。

类型:
发射

目标:
当前 ngInclude 范围

因此,您的markdown指令可以监视此事件并重新编译降价:

app.directive('markdown', function() {
  return {
    link: function(scope, elem, attrs) {
      // ...
      scope.$on('$includeContentLoaded', function() {
        recompileMarkdown();
      });
    }
  }
});

当然,另一种选择是根本不使用ngInclude,让您的markdown指令获取自己的降价文件,甚至可能使用$templateCache或其他一些$cacheFactory缓存进行缓存。(这可能是我要走的方向;即使你开始ngInclude工作,你的 markdown 中仍然有一个 DOM 元素——我相信,从长远来看,你自己控制内容会更容易。)

于 2013-05-29T16:17:29.027 回答