5

我正在尝试更改绑定到 DOM 模板某些部分的视图模型(而不是更改视图模型的值),但我只是不知道如何或是否可能

这是场景:

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

我想做相当于更改 WPF 中控件的 DataContext 的值(KO 的 MVVM 模式基于此)

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

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

4

2 回答 2

8

有两种使用多个视图模型的方法。第一种方法是像@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);
于 2012-12-26T22:31:47.630 回答
1

所以ko.applyBindings()应该为你介绍这个。您可以传入第二个参数,该参数告诉将绑定应用到哪个顶级元素,如下所示:

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

不过,您可能需要先清理元素,如下所示:

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

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

于 2012-12-26T05:20:12.323 回答