0

私はこのようなビューを持っています:

<xsl:comment>ko with: resolve(1)</xsl:comment>
<xsl:comment>ko template: { name: typeName }</xsl:comment>
<xsl:comment>/ko</xsl:comment>
<xsl:comment>/ko</xsl:comment>

そして、次のようなメソッドを持つビューモデル(ビューのデータコンテキスト):

self.resolve = function (id) {
    var obs = ko.observable(null);
    self.getItemByIdAsync(id).done(obs);
    return obs;
};

何らかの理由で、これは無限ループになります。私の推測では、with-binding はオブザーバブルの値に依存すると考えておりobs、それが更新されると with-binding は何度も何度も解決を実行しようとします...

resolve が 1 回だけ実行されるように、このコードを変更するにはどうすればよいですか?


私がやろうとしているのは、ビューが提示したいものに適応する動的ビューモデルを持つことです。ビューが特定のビューモデル コンテキスト内のアイテムを解決しようとする場合、このアイテムを非同期にロードし、新しいビューモデルを作成して、それを子ビューモデルとして datacontext-vm に追加する必要があります。

他の場所でこの非同期の観測可能なパターンを見たことがありますが、間違って使用しているようです。

4

1 に答える 1

0

あなたの観察は正しいです、self.resolveあなたが設定しようとしているときはいつでも呼び出されますobs、以下はノックアウトドキュメントからのものです:

指定した式に監視可能な値が含まれている場合、それらの監視可能な値のいずれかが変更されるたびに式が再評価されます。

self.resolveで関数を使用する理由がわかりません。withこの問題に対する私のアプローチはおそらく次のようになります。

function ViewMode() {
    ...
    self.obs = ko.observable(null);

    self.resolve = function (id) {
        self.getItemByIdAsync(id).done(self.obs);
    };

    self.resolve(1); // kick start the UI with id = 1
}

次に、ビューで を使用しますdata-bind="with: obs"

于 2013-07-02T16:57:39.333 に答える