0

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

// 'this' stands for any of the Views here
myModel.on('change:currentTextTitle', this.render, this); 

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

问题是该render方法也在最初调用 set()-Method 的 View 上调用,这是完全没有必要的,因为它已经与currentTextTitle.

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

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

myModel.set("currentTextField", newTextValue, thisViewSetAttribute)

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

4

1 回答 1

1

我认为“正确”的 MCV 解决方案是您的视图不应该知道或关心模型是如何变化的,他们应该简单地处理变化并相应地更新。如果它们已经是最新的,则用户不应该知道其中的区别。

我绝对不会将源视图传递给模型。相反,当模型更改时,您可以让视图检查它是否是当前的而不是重新渲染。但是,如果额外的渲染不会导致任何问题,那就让它发生吧:)

在 Backbone 中,“视图”既是视图又是控制器。因此,请尝试将更改视为 2 个单独的步骤。首先,将用户输入转换为模型上的更改,然后作为单独的步骤(由模型更改事件启动)处理该更改并更新视图。如果每个视图都这样做,那么无论模型如何更改,一切都将保持最新。

于 2013-02-11T06:05:53.077 回答