我正在尝试向主干添加一些功能,以便我可以与 mongodb 进行通信。现在我知道这在客户端不起作用;但是,我也喜欢主干的服务器端模型逻辑功能。我注意到,如果我继续为每个模型添加相同的功能,我会做大量重复工作,因此我决定在服务器端创建一个“app_model”文件来扩展主干。我也不想覆盖标准的 Backbone 函数,因为它们将是有用的客户端。
所以让我们以这个用户类为例:
var Backbone = require('./app_model');
var User = Backbone.Model.extend({
name : "users",
defaults: function() {
return {
username: "default",
role: 2,
created: new Date(),
updated: new Date(),
logged: new Date()
};
},
idAttribute: "username",
/**
* A predefined listing of user roles
*/
userRoles: [
"admin", //0
"author", //1
"user" //2
],
initialize: function() {
if(!!app) {
this.svrInit();
}
}
});
module.exports = User;
我想通过使用我的“app_model.js”文件将函数附加到主干上,该文件目前看起来像这样:
var Backbone = require('backbone'),
Deferred = require('Deferred'),
when = Deferred.when;
Backbone.Model.prototype.svrInit = function() {
//TODO: perhaps the code below should be made static some how so we don't have a bunch of instances of collection
var model = this;
if(!!app.db){
app.db.collection(this.name,function(err,collection){
model.collection = collection;
});
}
};
Backbone.Model.prototype.svrSave = function() {
var model = this.toJSON();
var dfd = new Deferred();
this.collection.insert(model, {safe:true}, function(err, result){
dfd.resolve();
});
return dfd;
};
Backbone.Model.prototype.svrFind = function(options) {
var model = this.toJSON();
var dfd = new Deferred();
this.collection.find(options, {safe:true}, function(err, result){
dfd.resolve();
});
return dfd;
};
module.exports = Backbone;
当我把它抽象出来时,我运行了我的测试,它似乎工作正常。有没有更好的方法来做到这一点?有坑掉吗?我正在使用全局“app”变量,这很糟糕吗?如果是这样,有什么方法可以解决它?我确实觉得我不得不this.svrInit()
在模型级别的 init 函数中放入它很难看,无论如何在创建后自动实现这一点?