请考虑遵循Backbone应用程序结构:
AppView
Subview
FirstSubviewInQuestion
Subview
Subview
SecondSubviewInQuestion
应用程序视图创建并存储特殊项目的集合。在某个时间,第一个和第二个子视图需要访问该集合。现在将收集品传递给他们的最佳方法是什么?
我自己也看到了一些方法,但每个方面都有缺点:
1)创建该集合的实例不在App View中,但更全局,然后将其作为依赖项传递(项目使用RequireJS;因此它将传递给AppView和两个Subviews)。 缺点:app视图应该是应用程序中最重要的元素。但突然之间,我们收集了一些收藏品。
2)或者我可以这样做:
// some subview
var collection = {};
Backbone.trigger( "item:getSpecialItems", collection);
// now the collection has data
// app view
this.listenTo( "item:getSpecialItems", function(obj) {
// copy collection to passed object
_.extend(obj, this.specialCollection);
});
缺点:我们正在引发全球性事件。我们知道只有应用程序视图会响应,但感觉就像一个糟糕的设计。另外,这种传递集合的方式看起来像是一个黑客。
也许有其他一些聪明的方法可以做到这一点?
答案 0 :(得分:1)
我会说#1。
应用视图应该是应用程序中最重要的元素
是的,但你在谈论(我想)一个Collection
,而不是View
;这两个是你的应用程序的完全独立的部分(在MVC中,第一个是“M”,第二个是“V”)。根据定义,如果您的视图是由您的数据驱动的,则数据必须比任何视图都“更高”(在依赖关系树中),所以我认为这种方法没有任何问题。
答案 1 :(得分:1)
如果您的目标是获取集合的共享实例,我的方法是将其从父级传递到“子视图”并从子视图传递到其子级。但是,我不一定会使用require来传递此集合的单个部分。
您还可以将有关“创建和存储特殊对象”的特殊方法的视图中的所有逻辑提取到一个辅助类中,该辅助类的唯一域就是这个。然后,该帮助程序将成为可从视图层次结构外部使用的实用程序, 或许 甚至可以全局或通过require。