【问题标题】:In backbone.js, Is it wrong for the model to know about its view?在backbone.js中,模型知道它的视图是错误的吗?
【发布时间】:2012-01-29 01:07:02
【问题描述】:
假设我有大量的图像模型,并且在任何时候,实际上只渲染了 50 个缩略图视图。我想让用户可以选择从集合中查看另外 50 张随机图像...所以我想给每个图像模型一个 onDisplay 属性。
show-random 方法选择 50 个随机项目并将 onDisplay 设置为 true。其中一些项目可能已经被渲染......如果没有,则创建一个新的缩略图视图并将其附加到 Image 模型。如果视图已经渲染,那么它只是重新显示/附加到 DOM。
如果模型有一个指向它的指针,那么检查视图是否存在似乎是最容易完成的。但是我在这里违反了关注点分离吗?
【问题讨论】:
标签:
javascript
model-view-controller
backbone.js
【解决方案1】:
在 MVC 设计模式中,模型不应该知道任何关于视图的信息。例如,这允许以多种方式查看模型,例如以 HTML 或在画布元素中呈现。
如下图所示:
模型只能间接更新视图,例如通过触发事件。
图片来自here。
【解决方案2】:
是的,我同意,您不需要像那样将模型与他们的视图耦合。
onDisplay 属性很好。如果您的所有 Image 模型都在一个集合中,那么只需让另一个“父”视图侦听集合上 onDisplay 属性的更改。
如果属性发生变化,“父”视图可以根据需要渲染/删除缩略图视图(因为它们将是子视图)。
【解决方案3】:
为什么不创建一个处理视图缓存的外部方法?当模型去构建一个新视图时,它不会直接构建它,而是将参数传递给那个外部方法。
从模型的角度来看,它调用了一个通用的“给我一个视图”函数。就是那个处理缓存的函数。然后,您可以更改该函数以更改行为,而无需直接修改模型。