首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果视图本身通过Backbone.Model.set()更新了模型,则不要调用render()

如果视图本身通过Backbone.Model.set()更新了模型,则不要调用render()
EN

Stack Overflow用户
提问于 2013-02-10 14:40:22
回答 1查看 706关注 0票数 0

在我的Backbone.js项目中,我有一个模型和几个视图。在此模型上,所有视图都为'change:currentTextTitle'注册了回调:

代码语言:javascript
复制
// 'this' stands for any of the Views here
myModel.on('change:currentTextTitle', this.render, this); 

现在,用户执行一些操作,这将导致特定视图更改其“当前文本标题”字段。然后,这个特定的视图调用myModel.set("currentTextField", newTextValue),这反过来触发调用所有视图(包括set()起源的视图)的'change:currentTextTitle'事件。然后所有视图都调用它们的render回调函数。

问题是,render方法也是在最初调用set()-Method的视图上调用的,这完全没有必要,因为它已经是currentTextTitle的最新版本。

我的视图如何调用myModel.set(),使其他视图的回调得到通知,但不触发/调用“源视图”本身?

一个解决方法似乎是将源视图作为set()方法的set()参数的一部分传递(该参数将传递给trigger(),然后沿着render()回调传递):

代码语言:javascript
复制
myModel.set("currentTextField", newTextValue, thisViewSetAttribute)

然后,在render回调中,可以检查thisViewSetAttribute != this是否。但是,与其在每个回调中实现检查,我认为在模型本身中处理这个问题更有意义,只调用必要的回调,而忽略set()方法调用起源的源视图。这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-11 06:05:53

我认为‘适当’的MCV解决方案是,您的观点不应该知道或关心模型如何改变,他们应该简单地处理更改和相应的更新。如果它们已经是当前的,用户就不应该知道它们的区别。

我肯定不会将源视图传递给模型。相反,当模型更改时,您可以让视图检查它是否是当前的,而不是重新呈现。但是,如果额外的呈现不会引起任何问题,那么就让它发生吧:)

在主干中,“视图”既是视图又是控制器。因此,尝试将更改处理为两个单独的步骤。首先,将用户输入转换为模型上的更改,然后作为单独的步骤(由模型更改事件发起)处理该更改并更新视图。如果每个视图都这样做,不管模型如何变化,一切都将保持最新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14798842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档