0

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

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

我有一组分组视图。每个分组的视图数组包含来自多个集合的视图。例如,

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 = ???

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

4

1 回答 1

1

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

看法:

initialize : function(){
  this.model.on('customAction', this.customAction);
},
customAction : function(){
   //here you could do the DOM manipulation that you need on your previous view
}

在您的代码中添加以下内容:

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);
于 2013-04-24T23:44:54.020 回答