我在哪里将全局覆盖置于模块化Backbone.js站点中?

时间:2014-05-12 16:00:50

标签: backbone.js requirejs prototype override

我们使用RequireJS为我们的Backbone.js网站添加模块化。我发现自己需要覆盖Backbone.Collection类来添加高级过滤例程。

我的问题是,我有以下内容'覆盖',

Backbone.Collection.prototype.advanceFilter = function() {
     /* Filtering code here */
};

我们的网站结构如下所示:

Site Structure

其中,main.js位于顶层且位于app.js之下;我在哪里添加这个覆盖,这样我就不必为每个类添加一个新模块到我们的RequireJS定义中?更一般地说,通常推荐使用Backbone的覆盖范围?

2 个答案:

答案 0 :(得分:4)

创建一个文件(比如模块文件夹中的Overrides.js)

define(function(require){

    var app = require('app');

    Backbone.Collection.prototype.advanceFilter = function() {
       /* Filtering code here */
    };


    // other overrides can also be added here in this file like
    _.extend(Backbone.View.prototype,{}, {
        // adding functions or overriding something
    })
});

现在,需要在main.js中使用此文件,如

require([
    'backbone',
    'App',
    'modules/Overrides',
    'globalize',
    .
    .
    .
],
function ( Backbone, App, ..... ) {

});
你去吧!

说,我想在视图中添加一些函数或覆盖一些函数,例如渲染,初始化,删除,......在应用程序中普遍使用。你可以这样做:

_.extend(Backbone.View.prototype,{}, { 

    remove: function() { 

        alert("View removed");
        this.$el.remove();
        this.stopListening(); 
        return this; 

    }

});

答案 1 :(得分:2)

如果使用requirejs,一个简单的选项,在您的require config中添加一个init语句。例如,

require.config({
     shim: {
         'backbone': {
             deps: ['underscore', 'jquery'],
             exports: 'Backbone',
             init: function (_) {
                 Backbone.Collection.prototype.advanceFilter = function() {
                 /* Filtering code here */
                 };
             }
         }
     }
 });

或者,您可以使用map配置调用将所有主干电话放入已覆盖的主干,

require.config({
    map: {
      '*': { 'backbone': 'backbone-custom' },
      'backbone-custom': { 'backbone': 'backbone' }
    }
});

// backbone-custom.js file:
define(['backbone'], function (Backbone) {
    Backbone.Collection.prototype.advanceFilter = function() {
    /* Filtering code here */
    };

    return Backbone;
});

任何一种情况都会将覆盖加载到骨干对象中,然后才能在任何地方使用。