2013-04-24 66 views
0

现在我明白这可以通过引用来自其模型的视图来实现。然而,我试图坚持Backbone.js的“最佳实践”,在那里被认为是糟糕的做法 - 模型 - >视图往往是一对多的关系。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 = ???

我将如何做到这一点之后的设计模式,模型是无知的观点。

+0

你真的需要访问的看法,或者你想要的视图来执行的东西? – Loamhoof 2013-04-24 11:23:49

+0

@Loamhoof我需要访问视图,因为我需要执行DOM操作。 – 2013-04-24 11:54:21

+1

然后我想你可以在之前的模型中触发一个自定义事件,并让视图做他们的东西。 – Loamhoof 2013-04-24 12:02:46

回答

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); 
+0

谢谢,但我应该更好地解释,我需要获取前一个视图元素的高度和位置(这就是为什么我需要访问视图)供当前视图元素使用(为什么触发事件将不起作用) 。 – 2013-04-25 09:43:29

+0

我更新了我的答案,因为你更新了你的问题。我添加了一些可以使用的逻辑,请让我知道其他任何疑问 – 2013-04-25 10:16:23

+0

感谢您的答案,但最终我决定将此逻辑从Backbone模型/视图逻辑中移除,因为我意识到了更快的方法这样做。 – 2013-04-26 09:15:43