1

デュランダル/ノックアウトの使用中に奇妙な問題が発生します。場合によっては、バインディングが正しく機能しないことがあります。この質問に出てきた状況を単純化しました。

次のように、コードのどこかにコンポジション情報を設定しています。

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 を使用しています。

4

2 に答える 2

0

構成情報オブザーバブルに問題があります。activate の値は true または false である必要があり、viewModelInstance.activate 関数自体はコンポジション バインディングによって検出/呼び出されます。

関連するドキュメントへのリンクは次のとおりです - https://github.com/BlueSpire/Durandal/blob/master/docs/1.2/Composition.html.md#activate

これは、単純化されたバージョンのコードを作成しようとしているだけのタイプミス/問題ですか?

compositionInfo({
    model: viewModelInstance,
    view: viewName,
    activate: true
});
于 2013-11-03T23:35:35.537 に答える