【发布时间】:2015-04-15 08:50:58
【问题描述】:
我正在使用 Dojo 1.9 开发一个单页 Web 应用程序。
我们使用 Dojo Parser 初始化从服务器加载到 dojox.layout.ContentPane 的 HTML 片段中的小部件。
在我们将 ContentPane 插入页面之前,我们希望等到所有小部件完全完成初始化。
有没有办法做到这一点?
我一直试图通过等待 ContentPane.content 返回的承诺来实现这一点,但这似乎更早得到解决。
var onParseEnd = pane.set("content", htmlText);
我认为 onParseEnd 会在解析器“解析”HTML 内容后立即解决,而不是在所有小部件初始化完成后解决。
【问题讨论】:
-
你试过dojo/parser吗?它返回一个在所有 dojo 小部件被实例化后得到解决的承诺。例如
require (["dojo/parser"], function ( parser ){ parser.parse( html_fragment ).then(onComplete_Callback);}); -
不幸的是,我们只间接使用了dojo/parser。我们调用 'ContentPane.set("content", htmlFragment)' 因为它还执行放置在片段中的 Javascript,附加 CSS...等
-
根据 end 的 dojox/contentpane documentation,它确实提供了一个线索(遗憾的是尚不清楚),这可能是您问题的解决方案。文档是这样的。通过使用scriptHasHooks设置、Deferred instance、onLoadDeferred及其then()方法,可以模拟dojo。从加载的内容中准备好 行为。另一种方法是设置 scriptHasHooks=true,并在加载的内容中包含这样的内容:
-
这里是关于dojoforum的讨论,涉及到类似的问题
-
是的,没错。
onLoadDeferred只等待内容本身加载(在设置href而不是content的情况下)和parse运行(以防有任何需要的新模块)。dojox/layout/ContentPane启用的脚本执行不会延迟解析(实际由dojox/html/_base处理)。理想情况下,最好根据需要将 JavaScript 组织成模块和模板化小部件,以便您的代码组织良好,并且您最终不会受到作为混合内容的一部分评估的松散脚本的摆布。
标签: javascript dojo single-page-application