2016-08-25 3 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トピックはアクティブ化されません。面白いことは、発動しないsuccess関数だけでなく、error関数も発火しないということです。約束はちょうど開いたままです。

.resolve()をチェーンの最後に追加するか、コードの後ろにあるcontentPaneWidget.onLoadDeferred.resolve()を後で呼び出すか、コンソールから手作業で約束を解決すると、すべてが期待通りに機能しなくなります。 As documentedset("href", ...)が約束を返すと、ネットワークオペレーションとコンテンツのレンダリングが完了した後、約束は決して解決されません。

この使用法は間違っていますか? Dojoにバグはありますか?あるいは、私はこのアプリのコードで他のグレムリンを探していますか?

+0

延期での解決を参照してください。 /キャッチ。あなたがロードしているコンテンツがJSエラーを引き起こし、エラーがtry catchによってswalloされて、何も表示されないようだと思います。 – ben

+0

@ben Cha-ching私たちは勝者です! 'set( 'href'、...)を囲むアプリケーション内のコードブロック全体が、Dojoがやっていたことを妨げていたtryステートメントにラップされていました。私は試して大規模なtryブロックを削除し、例外をスローすることが知られている2つの行をラップするだけでそれを置き換え、アプリケーションは突然すべてのトピックチャネルが再び実行されている!私はそれを受け入れることができるので、メモを試してみる/受け入れることができますか? – Caleb

+0

それは助けてよかった!ほとんどの場合、 'try/catch'は解決策よりも問題になります;) – ben

答えて

1

延期の解決は、try/catchの範囲内です。
試みの中...あなたがロードされているコンテンツは、JSエラーを発生させ、このエラーは、このようにあなたは何も起こって表示されないtry/catchによってswalloedさhttps://github.com/dojo/dijit/blob/master/layout/ContentPane.js#L440

私は推測

関連する問題