2016-08-25 175 views
1

我正在努力修復爲老版本的Dojo編寫的相對較舊的應用程序中的錯誤,即使那時也從未正常工作,現在正在Dojo 1.10上運行。一些應用程序邏輯對於當前的Dojo範例來說並不完全正確,但其中一些似乎適合我,我無法弄清楚它爲什麼不能按預期工作。爲什麼我的Dojo ContentPane在加載內容後解析其承諾?

有一個基於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()或從控制檯手動調用contentPaneWidget.onLoadDeferred.resolve()),那麼所有內容都按預期啓動。 As documentedset("href", ...)正在回覆諾言,諾言只是在網絡操作和內容呈現完成後才解決。

這是不正確的用法? Dojo中有錯誤嗎?或者我在這個應用程序代碼中尋找其他gremlin?

+0

的延期中的決心一試內/抓住。我猜你正在加載的內容會激發一個JS錯誤,並且錯誤被try catch所吞噬,所以你什麼都看不到 – ben

+0

@ben Cha-ching我們有一個贏家!圍繞'set('href',...)'的應用程序中的整個代碼塊被包裝在一個try語句中,這個語句干擾了Dojo所做的任何事情。我刪除了嘗試大量的嘗試塊,並用只包裝已知會拋出異常的兩行代替它,應用程序突然將所有主題頻道再次運行!你能否將可能的嘗試/接受互動問題寫成答案,以便我可以接受? – Caleb

+0

它幫了大忙!在大多數情況下,「try/catch」比解決方案更具問題;) – ben

回答

相關問題