将数据从主应用程序视图传递到某些子视图

时间:2013-04-01 20:20:21

标签: backbone.js

请考虑遵循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);
});

缺点:我们正在引发全球性事件。我们知道只有应用程序视图会响应,但感觉就像一个糟糕的设计。另外,这种传递集合的方式看起来像是一个黑客。

也许有其他一些聪明的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

我会说#1。

  

应用视图应该是应用程序中最重要的元素

是的,但你在谈论(我)一个Collection,而不是View;这两个是你的应用程序的完全独立的部分(在MVC中,第一个是“M”,第二个是“V”)。根据定义,如果您的视图是由您的数据驱动的,则数据必须比任何视图都“更高”(在依赖关系树中),所以我认为这种方法没有任何问题。

答案 1 :(得分:1)

如果您的目标是获取集合的共享实例,我的方法是将其从父级传递到“子视图”并从子视图传递到其子级。但是,我不一定会使用require来传递此集合的单个部分。

您还可以将有关“创建和存储特殊对象”的特殊方法的视图中的所有逻辑提取到一个辅助类中,该辅助类的唯一域就是这个。然后,该帮助程序将成为可从视图层次结构外部使用的实用程序, 或许 甚至可以全局或通过require。