2

我在阅读关于Backbone的文章时发现的共识似乎是:不要在视图中存储东西,将其存储在模型中,然后让视图监听模型上的更改。跟踪视图状态信息的推荐方式是什么?

如果我们谈论的情况是,我们已经有了明显的模型 - 视图配对,这非常棒。例如,您有一个用户模型和一个UserView视图。很明显,你在视图上设置了一个模型属性,它监听模型的变化。

然而,假设我有一个视图,显示了一个东西的列表,并且有两个按钮可以在“列表视图”和“网格视图”之间切换。这是我在应用程序和网站中看到的一个非常常见的约定。我是否想要“列表视图”或“网格视图”与模型/集合本身无关;这个观点本身似乎非常具体。

起初我只是尝试使用完全像模型的视图:设置属性,绑定事件'change:propertyName',然后使用someView.set('propertyName')等等来更新它......但这不起作用。

一边想着如何处理这个,我以为我记得看到这样的事情之前:

var MyView = Backbone.View.extend({ 
    ... 
    model: Backbone.Model(), 
    ... 
}); 

因此,与有,比方说,一个的usermodel ..我们只是有一些“无类型”的模式。或者我想,我实际上可以创建一个新的课程,也许只是为了这个,我称MyViewModel ...虽然我没有看到一个理由。

这允许我像我想要的那样绑定到更改事件并使用someView.model.set(...)设置视图数据。

所以我的问题是:这是人们在Backbone中为视图状态做的常见事情吗?或者,还有更好的方法?谢谢。

回答

2

您是否希望在用户访问该页面时使用所选的显示样式(列表与网格)?如果是这样,最简单的解决方案可能是将该状态存储在localStorage中,并让视图类直接访问它。

如果你不需要当前的显示风格被记住,那么也许你根本不需要存储状态。单击按钮时风格发生变化。当页面刷新时,它将返回到默认值。

如果您的应用程序已登录有帐户的用户,并希望他们的选择跨他们使用的所有设备都坚持,你需要有像一个UserModel(其中有已登录用户的信息和偏好)记录他们的选择并将其保存到服务器。您的视图可以侦听此模型的更改。

Backbone的美(对我来说)是没有一个正确的方法去做某件事。这些想法只是一些可以处理它的方法。

您也可以在集合上拥有displayStyle属性。我从可排序的表中得到这个想法:在这种情况下,排序元数据是集合对象的一部分。当您通过选择列标题来改变表格时,您可以更改集合的comparator并对其进行处理。该视图将侦听“排序”事件,并在发生时重新渲染。你可以为显示风格做类似的事情(你可以通过在你的收藏中做this.trigger('display-style')并让视图监听该事件来创建自己的事件)。

最后,无论你决定管理该状态,你应该考虑这应该全部是一个视图类还是多个视图类。我认为这将取决于应用程序的复杂性。在很多情况下,例如ProductListViewProductGridView可能会更好,而不是带有两种显示样式的单个ProductView。将它们拆分为不同的视图可能会使未来更容易添加其他样式(ProductImageView,也许?)。

相关问题