5

ビューモデルの値を変更するのではなく、DOMテンプレートの一部にバインドされているビューモデルを変更しようとしていますが、それが可能かどうか、またはその方法がわかりません

シナリオは次のとおりです。

  • 新しいビュー モデル オブジェクトを作成する
  • バインドします (例: applyBindings(myViewModel)
  • 別のビュー モデル オブジェクトを作成する
  • 新しいオブジェクトを DOM の同じ部分にバインドして、すべての要素が新しいオブジェクトにバインドされるようにします。

WPF でコントロールの DataContext の値を変更するのと同じことをしたい (KO の MVVM パターンが基づいている)

この理由は、リスト内のオブジェクトの表現と独自のビュー内のオブジェクトの表現の両方に同じビュー モデルを使用しようとしているため、表示されているすべてのオブジェクトのビュー モデルが既にあるためです。リスト。

他にも回避策はありますが、これが最もエレガントな方法だと思います。

4

2 に答える 2

8

複数のビューモデルを操作するには 2 つの方法があります。最初の方法は、@nathan gonzalez が言ったように複数のバインドを行うことです。ビューモデルをバインドする必要があります。ただし、これは少し複雑です。そのため管理が難しい。

2 番目の方法は、マスター ビューモデルを使用することです。これをお勧めします。

http://jsfiddle.net/sinanakyazici/e29EZ/10/

<div data-bind="with: mainvm">
    <span data-bind="text: prop, click : action"></span>
</div>

var vm = function(value)
{
    this.prop = ko.observable(value);
    var self = this;
    this.action = function() {
        console.log("clicked: " + self.prop());
    }
}

var master = {
    mainvm : ko.observable(null)
}

master.mainvm(new vm('viewmodel 1'));
master.mainvm(new vm('viewmodel 2'));
ko.applyBindings(master);
于 2012-12-26T22:31:47.630 に答える
1

これko.applyBindings()をカバーする必要があります。次のように、バインディングを適用する最上位要素を指定する 2 番目のパラメーターを渡すことができます。

 ko.applyBindings(myExistingViewModel, $('#someElementId')[0]);

ただし、次のように、最初に要素をクリーンアップすることをお勧めします。

ko.cleanNode($('#someElementId')[0]);

これにより、バインディングが完全に削除され、その要素とその子バインディングのメモリ内データがクリアされます。

于 2012-12-26T05:20:12.323 に答える