我正在努力修复一个相对较旧的应用程序中的错误,该应用程序是为旧版本的Dojo编写的,即使在那时也从未正常工作,现在正在Dojo 1.10上运行。一些应用程序逻辑对于当前的Dojo范例来说并不完全正确,但有些对我来说似乎是正确的,我无法弄清楚它为什么没有按预期工作。
有一个基于dijit.layout.ContentPane
的自定义小部件。所添加的方法似乎都没有破坏原件,只能通过主题将一些滚动事件连接到其他小部件。还有一个主题可以触发ContentPane中的地址更改。
相关位看起来像这样:
// The widget is initially setup declarative markup
var contentPaneWidget = registry.byId("<content_pane_id>");
// This subscribe is actually part of the custom widget code, but
// the topic subscription and resulting set() work, so I don't think
// where this is run is relevant to the question
topic.subscribe("navEvent", function(url) {
contentPaneWidget.set("href", url).then(function() {
topic.publish("navComplete", url);
}, function(err) {
console.log("Navigation error:", err);
});
});
// This topic subscription in another widget should get fired after
// content loads in the ContentPane based widget
topic.subscribe("navComplete", function(url) {
console.log("Navigation finished:", url);
});
// Test the chain ov events by firing off a new URL to the nav topic
topic.publish("navEvent", "<new_content_url>");
内容加载正确。解析并加载URL,内容窗格随下载的内容一起更新。 问题是.then()
函数永远不会触发,因此 navComplete 主题永远不会被激活。有趣的是,它不仅仅是没有触发的成功函数,错误函数也不会触发。承诺刚刚开放。
如果我手动解析承诺(通过将.resolve()
添加到链的末尾或稍后在代码中调用contentPaneWidget.onLoadDeferred.resolve()
或从控制台手动调用),则所有内容都会按预期触发。 As documented set("href", ...)
正在返回一个承诺,在网络操作和内容呈现完成后,承诺永远不会得到解决。
这是不正确的用法吗? Dojo中有错误吗?或者我在这个应用程序代码中寻找其他一些gremlin?
答案 0 :(得分:1)
vtable
内的延迟决定
见https://github.com/dojo/dijit/blob/master/layout/ContentPane.js#L440
我猜你加载的内容会引发一个JS错误,vtable
会误传这个错误,因此你看不到任何事情......