Javascript 向主干模型添加更多功能

Javascript 向主干模型添加更多功能,javascript,node.js,backbone.js,Javascript,Node.js,Backbone.js,我正在尝试向主干添加一些函数,以便能够与mongodb通信。现在我知道这在客户端是行不通的;然而,我也喜欢主干网的服务器端模型逻辑功能。我注意到,如果我继续为每个模型添加相同的功能,那么我将重复大量的工作,因此决定在服务器端创建一个“app_model”文件来扩展主干。我也不想覆盖标准主干功能,因为它们在客户端非常有用 我们以这个用户类为例: var Backbone = require('./app_model'); var User = Backbone.Model.extend({

我正在尝试向主干添加一些函数,以便能够与mongodb通信。现在我知道这在客户端是行不通的;然而,我也喜欢主干网的服务器端模型逻辑功能。我注意到,如果我继续为每个模型添加相同的功能,那么我将重复大量的工作,因此决定在服务器端创建一个“app_model”文件来扩展主干。我也不想覆盖标准主干功能,因为它们在客户端非常有用

我们以这个用户类为例:

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模式与有限的继承结合起来非常有用。我们使用: