Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 跟踪视图状态信息的建议方法是什么?_Javascript_Backbone.js_Model View Controller_Mvvm_Underscore.js - Fatal编程技术网

Javascript 跟踪视图状态信息的建议方法是什么?

Javascript 跟踪视图状态信息的建议方法是什么?,javascript,backbone.js,model-view-controller,mvvm,underscore.js,Javascript,Backbone.js,Model View Controller,Mvvm,Underscore.js,我在阅读有关主干网的文章时发现的共识似乎是:不要在视图中存储内容,将其存储在模型中,然后让视图侦听模型上的更改 如果我们谈论的是一种情况,我们已经有了一个明显的模型视图配对,这是非常好的。例如,您有一个用户模型和一个用户视图。显然,您在视图上设置了一个模型属性,它会侦听其模型上的更改 但是,假设我有一个视图,它显示了一个物品列表,并且有两个按钮可以在“列表视图”和“网格视图”之间切换。这是我在应用程序和网站中看到的一个非常常见的惯例。我想要的是“列表视图”还是“网格视图”与模型/集合本身并不相关

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

如果我们谈论的是一种情况,我们已经有了一个明显的模型视图配对,这是非常好的。例如,您有一个用户模型和一个用户视图。显然,您在视图上设置了一个模型属性,它会侦听其模型上的更改

但是,假设我有一个视图,它显示了一个物品列表,并且有两个按钮可以在“列表视图”和“网格视图”之间切换。这是我在应用程序和网站中看到的一个非常常见的惯例。我想要的是“列表视图”还是“网格视图”与模型/集合本身并不相关;它似乎非常特定于视图本身

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

在思考如何处理这个问题时,我想我记得以前看到过类似的情况:

var MyView = Backbone.View.extend({
    ...
    model: Backbone.Model(),
    ...
});
因此,与拥有用户模型不同。。我们只是有一些“无类型”的模型。或者,我想,我实际上可以创建一个新类,可能叫做
MyViewModel
,就是为了这个。。。虽然我看不出有什么理由

这使我能够像以前一样绑定到更改事件,并使用
someView.model.set(…)
设置视图数据


所以我的问题是:这是人们在视图状态下经常做的事情吗?还是有更好的办法?谢谢。

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

如果不需要记住当前的显示样式,那么可能根本不需要存储状态。单击按钮时更改样式。当页面刷新时,它将返回默认值

如果您的应用程序已使用帐户登录用户,并且您希望他们的选择在他们可能使用的所有设备上保持不变,那么您需要有一个类似于
UserModel
(其中包含登录用户的信息和首选项)的东西来记录他们的选择并将其保存到服务器。您的视图可以侦听此模型上的更改

(对我来说)脊梁骨的美妙之处在于没有一种正确的方法来做某事。这些想法只是解决问题的一些方法

您还可以在集合上具有
displayStyle
属性。我从可排序表中得到了这个想法:在这种情况下,排序元数据是集合对象的一部分。通过选择列标题使用表时,可以更改集合的
比较器
并使用它。视图将侦听“排序”事件,并在事件发生时重新渲染。您可以对显示样式执行类似的操作(您可以通过在集合中执行
this.trigger('display-style')
并让视图侦听该事件来创建自己的事件)

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