gpt4 book ai didi

javascript - 向 Backbone 模型添加更多功能

转载 作者:搜寻专家 更新时间:2023-11-01 00:19:01 25 4
gpt4 key购买 nike

我正在尝试向主干添加一些功能,以便我可以与 mongodb 进行通信。现在我知道这在客户端不起作用;但是,我也喜欢 backbone 的服务器端模型逻辑功能。我注意到,如果我一直为每个模型添加相同的功能,我会做很多重复的工作,所以我决定在服务器端创建一个“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 函数中,是否可以在创建后自动实现这一点?

最佳答案

所以我已经思考了几天这个问题,我想到的最干净的事情是这样的:

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
}
} );

所以它所做的基本上是创建一种全新的 Backbone.Model。一个也调用 specialInitializer。如果您查看 backbone sourceBackbone.Model 的构造函数定义之后,您会看到这是一个类似的策略。

  • 构建实例。
  • 调用实现者应该定义的初始化程序。
  • 使用功能扩展原型(prototype)(在他们的例子中是 Backbone.Events,在我们的例子中是 Backbone.Model)。

您的新初始化程序当然可以调用它需要的任何其他内容,等等。

关于您关于静态集合内容和全局应用程序变量的其他问题,恐怕我没有完全理解那里发生的事情,因为我没有看到 app 的定义并且不知道您将集合用于什么目的。

这是 a fiddle这通过一些额外的日志记录等来证明这一点。

关于javascript - 向 Backbone 模型添加更多功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11217959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com