有没有办法可以用新的模型信息覆盖旧的模型信息,但保留我的UI元素的所有绑定?
解决方法
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模型中不会更改的数据.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。