Javascript Backbone.js从集合中获取上一个视图

Javascript Backbone.js从集合中获取上一个视图,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,现在我明白了这可以通过引用其模型中的视图来实现。然而,我试图坚持Backbone.js的“最佳实践”,因为model->view通常是一对多的关系,所以这被认为是糟糕的实践 我的问题是这样的(代码示例帮助您可视化问题): 我有一组分组视图。每个分组的视图数组都包含来自多个集合的视图。e、 g var views; // Assume views is pre-populated with an array of views, each view's model may be stored in

现在我明白了这可以通过引用其模型中的视图来实现。然而,我试图坚持Backbone.js的“最佳实践”,因为model->view通常是一对多的关系,所以这被认为是糟糕的实践

我的问题是这样的(代码示例帮助您可视化问题):

我有一组分组视图。每个分组的视图数组都包含来自多个集合的视图。e、 g

var views; // Assume views is pre-populated with an array of views, each view's model may be stored in a different collection.

var viewGroups = _.groupBy(views, function(view) {
    return view.model.attributes.timestamp; // Unix timestamp for example
});
当我在分组视图中循环时,我需要访问模型的视图,这些视图直接位于其集合中每个视图的模型之前

我可以访问集合中以前的模型,如下所示:

_.each(viewGroups, function(viewGroup) {
    _.each(viewGroup, function (view) {
        var model = view.model;
        var collection = model.collection;
        var previousModel = collection.at(collection.indexOf(model) - 1);
    });
});
但由于模型与视图之间没有关联,我无法找出哪些视图订阅了集合中的前一个模型

var-previousModelsViews=???


按照模型不知道视图的设计模式,我将如何做到这一点。

您不需要知道视图。只需在视图中添加自定义事件侦听器:

视图:

在代码中添加以下内容:

var previousModel = collection.at(collection.indexOf(model) - 1);
previousModel.trigger('customAction');
更新:更新需求后: 我仍然认为一切都可能与事件有关,就在前面的视图中,分派其他事件:

视图:

在代码中添加以下内容(检查我是否在触发器中添加了上一个模型):


您真的需要访问视图,还是希望视图执行某些操作?@Loamhoof我需要访问视图,因为我需要执行DOM操作。然后我想您可以在以前的模型中触发自定义事件,并使视图发挥作用。谢谢,但我应该更好地解释,我需要获取上一个视图元素的高度和位置(这就是我需要访问该视图的原因),以供当前视图元素使用(为什么触发事件无效)。我更新了答案,因为您更新了问题。我添加了一些您可以使用的逻辑,请让我知道任何其他疑问谢谢您的回答,但是最后我决定将此逻辑从主干模型/视图逻辑中删除,因为我意识到这样做的速度要快得多。
var previousModel = collection.at(collection.indexOf(model) - 1);
previousModel.trigger('customAction');
initialize : function(){
  this.model.on('customAction', this.customAction);
  this.model.on('PreviousWindowSize', this.previousSizeReceived);
},
//Previews View will arrive here 
customAction : function(nextModel){
   nextModel.trigger('PreviousWindowSize', {width: this.$el.width()});
},
//Current View will receive the size of the previous View here
previousSizeReceived : function(size){
   console.log(size);
}
var previousModel = collection.at(collection.indexOf(model) - 1);
previousModel.trigger('customAction', previousModel);