【问题标题】:Listen to the end of widget initializations done by the Dojo parser收听 Dojo 解析器完成的小部件初始化的结束
【发布时间】: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 instanceonLoadDeferred及其then()方法,可以模拟dojo。从加载的内容中准备好 行为。另一种方法是设置 scriptHasHooks=true,并在加载的内容中包含这样的内容:
  • 这里是关于dojoforum的讨论,涉及到类似的问题
  • 是的,没错。 onLoadDeferred 只等待内容本身加载(在设置href 而不是content 的情况下)和parse 运行(以防有任何需要的新模块)。 dojox/layout/ContentPane 启用的脚本执行不会延迟解析(实际由dojox/html/_base 处理)。理想情况下,最好根据需要将 JavaScript 组织成模块和模板化小部件,以便您的代码组织良好,并且您最终不会受到作为混合内容的一部分评估的松散脚本的摆布。

标签: javascript dojo single-page-application


【解决方案1】:

如果您需要确保小部件已呈现,您可以考虑 domReady! 在小部件初始化后触发事件:http://dojotoolkit.org/reference-guide/1.10/dojo/domReady.html

但是,小部件的 startup() 事件通常是更好的选择,以避免在浏览器呈现后添加/修改内容时出现“故障”。 p>

【讨论】:

  • 感谢您的回答。我不认为domReady!适合这里。因为我正在处理一个 HTML 片段(这是一个 SPA,主页是很久以前加载的),domReady!立即触发,并且不会等到片段中的小部件初始化完成。 domReady!当您加载一个简单的 Dojo 页面(或 SPA 的主页/首页)时,可能会像您说的那样工作。
  • 抱歉,错过了SPA部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 2013-05-07
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多