现在我有很多绑定到主干模型的UI元素.此模型包含客户信息,每次搜索新客户时都会更改模型,然后将其引入焦点.以前的客户模型被这个新模型覆盖.如果不是所有字段中的大多数字段都是
有没有办法可以用新的模型信息覆盖旧的模型信息,但保留我的UI元素的所有绑定?
一般来说,如果你有someView,someView是用{model:someModel}声明的,并且你想让someView使用someOtherModel,那么正确的做法是:someView.model = someOtherModel;
正如gumballhead建议的那样,您可以简单地使用以下方法更改模型的数据:
someView.model.set(someOtherModel.toJSON());
但那……这不是最好的比喻,但这有点像擦掉Tim Lincecum棒球卡并在上面画Matt Williams,而不是简单地换一张Tim牌作为Matt牌.无论哪种方式,你都会拿到一张名为马特的棒球卡,但从概念上讲,这是一个与众不同的世界.
但是,如果您有大量共享相同模型的视图类,并且您希望一次性地为所有视图更改该模型,那么您可以采用几种方法.
一种方法是跟踪某个列表中的所有视图,然后每当您想要更改模型迭代所有视图时,如下所示:
var viewsThatUseBaseballCard = [view1, view2, view3, view4]; ... _(viewsThatUseBaseballCard).each(function(view) { view.model = someOtherModel; });
另一种方法是避免使用内置的this.model,而是在View代码中使用一个函数来随时获取模型;换句话说,而不是:
var MyView = Backbone.View.extend({ someMethod: function() { this.model.doSomething(); } }); var MyView = Backbone.View.extend({ someMethod: function() { getCurrentModel().doSomething(); } });
(当然,你需要做一些事情来让getCurrentModel返回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模型中不会更改的数据.