现在我有很多绑定到主干模型的 UI 元素。该模型包含客户信息,并且每次搜索新客户时都会更改该模型,然后将其聚焦。以前的客户模型被这个新的模型覆盖。其中大多数(如果不是所有字段)名称相同,某些数组可能具有或多或少的元素,但总体上几乎相同。
有没有办法可以用新模型信息覆盖旧模型信息,但保留我的 UI 元素具有的所有绑定?
现在我有很多绑定到主干模型的 UI 元素。该模型包含客户信息,并且每次搜索新客户时都会更改该模型,然后将其聚焦。以前的客户模型被这个新的模型覆盖。其中大多数(如果不是所有字段)名称相同,某些数组可能具有或多或少的元素,但总体上几乎相同。
有没有办法可以用新模型信息覆盖旧模型信息,但保留我的 UI 元素具有的所有绑定?
一般来说,如果你有someView
,并且someView
被声明了{model: someModel}
,并且你想someView
使用someOtherModel
它,那么正确的方法是:
someView.model = someOtherModel;
正如 gumballhead 建议的那样,您可以简单地更改模型的数据:
someView.model.set(someOtherModel.toJSON());
但那是......好吧,这不是最好的类比,但这有点像擦除蒂姆林塞姆棒球卡并在上面画马特威廉姆斯,而不是简单地将蒂姆卡换成马特卡。无论哪种方式,你都会得到一张写着马特的棒球卡,但从概念上讲,这是一个不同的世界。
但是,如果您有很多共享相同模型的视图类,并且您希望一次为所有视图更改该模型是一种方便的操作,那么您可以采取一些方法。
一种方法是在某处跟踪列表中的所有视图,然后每当您想更改模型时遍历所有视图,如下所示:
var viewsThatUseBaseballCard = [view1, view2, view3, view4];
...
_(viewsThatUseBaseballCard).each(function(view) {
view.model = someOtherModel;
});
另一种方法是避免使用内置this.model
函数,而是在视图代码中使用函数来在需要时获取模型;换句话说,而不是:
var MyView = Backbone.View.extend({
someMethod: function() {
this.model.doSomething();
}
});
var MyView = Backbone.View.extend({
someMethod: function() {
getCurrentModel().doSomething();
}
});
(然后当然你需要做一些事情来制作getCurrentModel
return someOtherModel
,但至少它会集中到代码中的一个地方)。
上述还有其他变体,但总体思路是您可以:
A)this.model
在您的视图中使用并this.model
根据需要设置一个新的
B)在您的视图中使用某种getModel()
调用,并修改告诉该函数以适当地返回新模型
(或者你可以 C)保持相同的模型并改变它是什么,即。擦除/重写棒球卡选项)。
我个人可能会倾向于 B),但这最终取决于您的具体情况。
* 编辑 *
刚刚意识到我错过了其他几个选项:
D)重新设计您的视图,使它们不依赖于相同的模型(不确定这是否适合您,但值得一提)
E) 使用“参考模型”;换句话说,而不是:
new SomeView({model: TimLincecum});
做:
new SomeView({model: currentPlayerReference});
然后,在您的视图中,执行以下操作:
this.model.getCurrentPlayer();
这与我的选项 B) 类似,但它还有一个额外的好处是可以让您存储模型中不会更改的数据currentPlayerReference
。