我们使用RequireJS为我们的Backbone.js网站添加模块化。我发现自己需要覆盖Backbone.Collection
类来添加高级过滤例程。
我的问题是,我有以下内容'覆盖',
Backbone.Collection.prototype.advanceFilter = function() {
/* Filtering code here */
};
我们的网站结构如下所示:
其中,main.js
位于顶层且位于app.js
之下;我在哪里添加这个覆盖,这样我就不必为每个类添加一个新模块到我们的RequireJS定义中?更一般地说,通常推荐使用Backbone的覆盖范围?
答案 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;
});
任何一种情况都会将覆盖加载到骨干对象中,然后才能在任何地方使用。