Javascript 向主干模型添加更多功能
我正在尝试向主干添加一些函数,以便能够与mongodb通信。现在我知道这在客户端是行不通的;然而,我也喜欢主干网的服务器端模型逻辑功能。我注意到,如果我继续为每个模型添加相同的功能,那么我将重复大量的工作,因此决定在服务器端创建一个“app_model”文件来扩展主干。我也不想覆盖标准主干功能,因为它们在客户端非常有用 我们以这个用户类为例:Javascript 向主干模型添加更多功能,javascript,node.js,backbone.js,Javascript,Node.js,Backbone.js,我正在尝试向主干添加一些函数,以便能够与mongodb通信。现在我知道这在客户端是行不通的;然而,我也喜欢主干网的服务器端模型逻辑功能。我注意到,如果我继续为每个模型添加相同的功能,那么我将重复大量的工作,因此决定在服务器端创建一个“app_model”文件来扩展主干。我也不想覆盖标准主干功能,因为它们在客户端非常有用 我们以这个用户类为例: var Backbone = require('./app_model'); var User = Backbone.Model.extend({
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函数中,在创建之后是否有自动实现的方法?所以我已经思考了几天这个问题,我想到的最干净的东西是这样的:
var MyModel = function( attributes, options ) {
Backbone.Model.apply( this, arguments );
this.specialInitializer();
};
MyModel.extend = Backbone.Model.extend;
_.extend( MyModel.prototype, Backbone.Model.prototype, {
specialInitializer: function() {
// called after the users 'initialize'
console.log("MyModel initialized.", this);
},
otherNewMethod: function() {
// this is just like any other instance method,
// just as if Backbone.Model implemented it
}
} );
因此,这基本上是制造一种全新的主干.Model
。还调用特殊化器的一种。如果查看Backbone.Model
的构造函数定义后面的,您会发现这是一个类似的策略
- 构造实例
- 调用实现者应该定义的初始值设定项
- 用功能扩展原型(在他们的例子中是
Backbone.Events
,在我们的例子中是Backbone.Model
)
您的新初始值设定项当然可以调用它需要的任何其他内容,等等
至于您关于静态集合内容和全局应用变量的其他问题,我恐怕没有完全了解其中的内容,因为我没有看到app
的定义,也不知道您使用集合的目的
下面是一些额外的日志记录来演示这一点。我正在处理一个相当大的代码库,在视图中有4-5个继承级别。这是我正在使用的模式:
var BaseView = Backbone.Model.extend({
somefunc: function() {
//contents
},
otherfunc: function(a,b,c) {
//contents
},
//...
});
var User = BaseView.extend({
// things in user view can now access somefunc and otherfunc
});
下面是a中的一个快速示例(注意doSearch函数被继承)Ahh,我明白了!我看到过一些类似的概念,但不确定它是如何实现的。我的部分问题是关于Node.JS的。我有一个server.js文件,它使用expressjs定义了一个变量应用程序。它是一个全球性的,可通过我的应用程序的服务器端部分访问。我看到的所有例子都是这样做的。我想我可以把它想象成“窗口”或“文档”;但是,我创建了一个db连接,并将其也放入app
变量中。否则,我将为每个模型创建新的DB连接。我想这是有道理的。但是,不鼓励使用全局变量…app.db.collection
是app全局变量。db是mongodb的NodeJS库的一部分。集合是指mongodb集合。如果您不了解集合,它们基本上就像表。所以我正在对它们执行查找和插入操作。我也喜欢调用初始化函数的解决方案!谢谢你的帮助!我对MongoDB和Node很熟悉,但我肯定遗漏了什么。您是否在服务器端使用主干网?如果是这样的话,我认为可以像您一样使用globals。是的,我正在使用主干服务器端,并试图在客户端重用相同的类。我想我将使用requirejs客户端,并在那里使用不同的MyModel
类。这样我可以保持大多数模型逻辑的完整性,包括验证等。我甚至可以做一些事情,比如使用jQuery中的延迟库,而不是我目前使用的另一个服务器端库。我们注意到4->5级继承让我们陷入了一堆麻烦。我们认为mixin模式与有限的继承结合起来非常有用。我们使用: