如何构建基于Backbone.View的插件,以便可以单独扩展其嵌套视图?

时间:2012-04-16 10:07:06

标签: javascript inheritance dependency-injection backbone.js requirejs

我正在设计一个通用对象浏览器插件,其功能类似于OS X的列视图中的Finder。我已经将界面划分为几个嵌套视图,浏览器,列和对象。

我将在几个场景中使用此插件,其中浏览器视图,对象视图和列视图可能需要或可能不需要自定义。有时,对象将是文件和文件夹。

This is OS X's Finder in column view in case you don't know what it looks like.

目前我正在使用RequireJS来传递依赖项,但是为了简单地继承和扩展ObjectView,我必须替换整个堆栈。

是否有更好的结构可以扩展插件但只是部分?

我可以使用另一个像Browser这样的对象,将三个视图存储在一些名称空间中,它们可以互相使用,如Backbone吗?

RequireJS会是什么样子?

BrowserView.js

var BrowserView = Backbone.View.extend({

    open: function () {
        var collectionView = new CollectionView( {collection: objects} );
    }

});

CollectionView.js

var CollectionView = Backbone.View.extend({

    render: function () {

        this.collection.each( function (object) {
            var objectView = new ObjectView( {model: objects} );

            objectView.bind('click', this.select, this);

            this.container.append( objectView.el );

            objectView.render();

            this.objectViews.push(objectView);
        }, this );

    },

});

ObjectView.js

var ObjectView = Backbone.View.extend({

});

三江源 XX

1 个答案:

答案 0 :(得分:2)

我会将这些视图放在同一个模块中。

模块的目的 - 无论您使用的是RequireJS还是普通的旧JavaScript模块 - 都是为了特定目的而封装一组相关的对象和函数。在这种情况下,您的目的是Finder视图。

通过将所有相关对象保存在同一个文件中,您可以更自由,更灵活地使对象协同工作。


作为旁注,但与你正在做的事情有关,你或许可以从我的Backbone.Marionette插件的“CompositeView”中获得一些如何使这项工作的想法。我以前用它构建了文件夹和文件的分层树视图,Finder的列视图也很容易用它构建。

请注意,我并不是说你需要使用我的插件。相反,我认为它可能有助于弄清楚如何构建代码。

我有一篇博文在此处讨论:http://lostechies.com/derickbailey/2012/04/05/composite-views-tree-structures-tables-and-more/

您可以在此处找到代码和文档:https://github.com/derickbailey/backbone.marionette

复合视图的带注释的源代码位于:http://derickbailey.github.com/backbone.marionette/docs/backbone.marionette.html#section-26