Knockout.js - 如何更改viewmodel

时间:2012-12-26 05:14:57

标签: javascript mvvm knockout.js

我正在尝试更改绑定到DOM模板某些部分的视图模型(而不是更改视图模型的值)但我无法弄清楚它是如何或者是否可能

以下是该方案:

  • 创建新的视图模型对象
  • 绑定它(例如applyBindings(myViewModel)
  • 创建另一个视图模型对象
  • 将新对象绑定到DOM的同一部分,以便所有元素现在都绑定到新对象。

我想在WPF中更改控件的DataContext的值(KO的MVVM模式所基于的)

这样做的原因是我试图对列表中对象的表示和对象在其自己的视图中的表示使用相同的视图模型,因此我已经有了所有对象的视图模型显示在列表中。

还有其他解决方法,但我认为这是最优雅的方法。

2 个答案:

答案 0 :(得分:8)

使用多个viewmodel有两种方法。第一种方式是做多个绑定,比如@nathan gonzalez说。您应该绑定视图模型。然而,这使事情变得复杂。因此难以管理。

第二种方法是使用主视图模型。我会推荐这个。

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);

答案 1 :(得分:1)

所以ko.applyBindings()应该为您报道。你可以传入第二个参数来告诉应用绑定的顶级元素,如下所示:

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

你可能想先清理这些元素,如下所示:

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

这将完全删除绑定并清除该元素及其子绑定的内存数据。