1

请考虑以下 Backbone 应用程序结构:

AppView
    Subview
        FirstSubviewInQuestion
    Subview
        Subview
            SecondSubviewInQuestion

应用程序视图创建并存储特殊项目的集合。在某个时间,第一个和第二个子视图需要访问该集合。现在将集合传递给他们的最佳方式是什么?

我自己看到了一些方法,但每种方法都有缺点:

1)不在App View内部创建该集合的实例,而是在全局范围内创建该集合的实例,然后将其作为依赖项传递(项目使用RequireJS;因此它将传递给AppView和两个子视图)。缺点:应用程序视图应该是应用程序中最顶层的元素。然而突然间,我们看到了一些漂浮在上面的集合实例。

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);
});

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

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

4

2 回答 2

1

我会说#1。

应用程序视图应该是应用程序中最顶层的元素

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

于 2013-04-01T21:45:42.817 回答
1

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

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

于 2013-04-02T00:55:53.350 回答