【问题标题】:Knockout.js - How to change the viewmodelKnockout.js - 如何更改视图模型
【发布时间】:2012-12-11 18:07:37
【问题描述】:

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

这是场景:

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

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

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

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

【问题讨论】:

  • 你能在 jsfiddle 中显示你的 js 代码吗?
  • 当然。 jsfiddle.net/e29EZ/1打开js控制台可以看到回调执行了两次。另一个小提琴 jsfiddle.net/e29EZ/6 正在使用 cleanNode(感谢下面的 nathan gonzález),但它仍在执行两次回调。

标签: javascript mvvm knockout.js


【解决方案1】:

有两种方法可以处理多个视图模型。第一种方法是像@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);

【讨论】:

  • 这很好用,谢谢!作为记录,这是一个帖子(感谢 nathan gonzalez),其中 KO 合作者 Michael Best 指出这是可能的:github.com/SteveSanderson/knockout/issues/41
【解决方案2】:

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

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

你可能想先清理元素,像这样:

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

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

【讨论】:

  • 谢谢。检查这个小提琴:jsfiddle.net/e29EZ/6,即使我调用了 cleanNode,点击回调也会执行两次(检查 js 控制台)。另外,cleanNode 是否记录在某处?
  • 好的,嗯。我发现这个 (github.com/SteveSanderson/knockout/issues/41) 谈论缺乏对你正在做的事情的支持。您是否考虑过将您的 html 放入模板并从模板中创建全新的 dom 结构?
  • 感谢您的链接。尽管 Steve Sanderson 声明它不是受支持的功能(大约 2 年前)。 Michael Best 是后来(约 11 个月前)重要的淘汰合作者,他解释了如何使用 @sinanakyazici 发布的可观察视图模型来做到这一点。
  • @JuanCampa,是的,没走那么远?那对你有用吗?如果是这样,请发布解决方案并接受它作为答案。子孙后代等等。
  • 完成! @sinanakyazici 的答案是一个
猜你喜欢
  • 2016-01-18
  • 1970-01-01
  • 2012-10-03
  • 2012-07-26
  • 1970-01-01
  • 2014-01-03
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多