2

我有一个 Angular JS 应用程序,我想(实际上我必须)在其中使用 dojo 小部件。在控制器的 HTML 模板中,我可以返回其中包含 dojo 标记的 HTML。然而,当视图被重新渲染时,dojo 解析不会自动发生。我能够触发重新解析的唯一方法是在稍微延迟后手动调用解析器,方法是在控制器中执行类似的操作,然后在我知道模型已更改时调用它。

refreshDojo = function() {
    setTimeout(function() {
        require(["dojo/parser"], function(parser) {
                parser.parse()
                });
        }, 10);
}

这实际上并不可行,原因有两个:

  1. 在超时后必须做任何事情必然会导致麻烦,要么在 html 被处理之前快速发生,要么两个缓慢发生,在创建小部件之前导致内容闪烁。
  2. 其次,如果我没记错的话,parser.parse() 会解析整个 DOM,如果我只更新一个 div,这不是很有效。

有没有办法确定 DOM 何时稳定,以便我可以确保在正确的时间触发它?有没有办法访问控制器的根元素(看来你不能再注入 $element 了)?

4

2 回答 2

3

你应该装饰$compile服务,所以在 Angular 编译任何东西之前,它会让 dojo 编译它。

这是一个小例子: http ://plnkr.co/edit/9iJJFLWDqGtyqLV5Mbe3?p=preview

关于装饰器的文档:http: //docs.angularjs.org/api/AUTO.$provide#decorator

于 2013-01-24T19:54:57.240 回答
0

您可以创建一个属性指令,该指令dojoType需要命名的小部件模块(如果需要,还可以使用 mixins)并实例化它们而不是 dojo 解析器。

例如,如果您已经加载了 DOM 的一部分('ajax'),那么您将首先为其创建一个新范围,编译并将其链接到范围(应用 dojoType 指令),然后您将调用dojo 解析器并指定rootNode.

dojoParser.parse({
    rootNode: dom.byId(domid)
}).then(/* access the widgets or whatever */);
于 2015-01-23T16:47:17.757 回答