跟踪视图状态信息的推荐方法是什么?

What is the recommended way(s) to keep track of View state information?

我在阅读有关 Backbone 的文章时发现的共识似乎是:不要在视图中存储内容,将其存储在模型中,然后让视图监听模型上的更改。

如果我们谈论的是我们已经有了明显的模型-视图配对的情况,那就太好了。例如,您有一个 User 模型和一个 UserView 视图。显然,您在视图上设置了一个模型 属性,它会监听其模型的变化。

但是,假设我有一个显示内容列表的视图,并且有几个按钮可以在 'list view' 和 'grid view' 之间切换。这是我在应用程序和网站中看到的一种非常常见的约定。我想要 'list view' 还是 'grid view' 与 models/collections 本身并不相关;它似乎非常特定于视图本身。

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

在考虑如何解决这个问题时,我想我记得以前见过这样的事情:

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

因此,与拥有 UserModel 不同,我们只有一些 'typeless' 模型。或者我想,我实际上可以创建一个新的 class,也许只是为了这个而称为 MyViewModel...虽然我没有看到这样做的理由。

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

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

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

如果你不需要记住当前的显示样式,那么也许你根本就不需要存储状态。单击按钮时更改样式。当页面刷新时,它returns到默认值。

如果您的应用有 logged-in 个拥有帐户的用户,并且您希望他们的选择在他们可能使用的所有设备上保持不变,您需要有类似 UserModel 的东西(其中有 logged-in 用户的信息和偏好),记录他们的选择并将其保存到服务器。您的视图可以侦听此模型上的更改。

Backbone(对我而言)的美妙之处在于,做某事没有唯一正确的方法。这些想法只是可以处理它的一些方法。

您还可以在 collection 上设置 displayStyle 属性。我从 sortable tables 得到这个想法:在那种情况下,排序元数据是 collection object 的一部分。当您通过选择列标题对 table 进行排序时,您更改了 collection 的 comparator 并对其进行排序。视图将监听 "sort" 事件,并在事件发生时监听 re-render。您可以为显示样式做类似的事情(您可以通过在 collection 中执行 this.trigger('display-style') 并让视图监听该事件来创建自己的事件)。

最后,无论您决定管理该状态,您都应该考虑这应该是一个视图 class 还是多个视图 classes。我认为这在很大程度上取决于您的应用程序的复杂性。在许多情况下,使用 ProductListViewProductGridView 可能比使用具有两种显示样式的单个 ProductView 更好。将它们拆分为单独的视图甚至可能使将来添加其他样式(ProductImageView,也许吧?)变得更容易。