デュランダル/ノックアウトの使用中に奇妙な問題が発生します。場合によっては、バインディングが正しく機能しないことがあります。この質問に出てきた状況を単純化しました。
次のように、コードのどこかにコンポジション情報を設定しています。
compositionInfo({
model: viewModelInstance,
view: viewName,
activate: viewModelInstance.activate
});
そして、これは私の見解です:
<div id="service-container"
data-bind="compose: { model: compositionInfo().model,
view: compositionInfo().view,
activate: compositionInfo().activate}">
初めて、構成は正常に機能します。しかし、次に変更が行われたときcompositionInfo
(同じ行とコードの同じ場所を使用) には、何も起こりません。
初めて["Activating",...]
ログ ウィンドウに が表示されます。しかし、2回目はそのようなログや["Binding"]
ログはありません。
Durandal と Knockout のコードをトレースしたところ、knockout-2.3.0.debug
ファイル内にevaluateImmediate()
この行を最初に実行する関数があることがわかりました (正しいもの)。
var newValue = readFunction.call(evaluatorFunctionTarget);
構成がモデルのアクティブ化を開始します。
しかし、それが機能していない場合、次のevaulateImmediate()
コードによって上記のいくつかの行が返されます。
// Don't dispose on first evaluation, because the "disposeWhen" callback might
// e.g., dispose when the associated DOM element isn't in the doc, and it's not
// going to be in the doc until *after* the first evaluation
if (_hasBeenEvaluated && disposeWhen()) {
dispose();
return;
}
このコードは何のためのものですか? これらの行にコメントを付けると、すべて正常に動作します。
この問題は、コンピューターによって異なります。私のコンピューターでは、ほとんどの場合、初めて機能します。しかし、他のコンピューターではほとんどの場合動作し、約 3/10 のケースで失敗します。
参考までに、Durandal 1.1.1 と Knockout 2.3.0 を使用しています。