如何在javascript中使用骨干js时创建模型对象

时间:2012-06-06 12:17:03

标签: javascript backbone.js javascript-objects

我的问题是我想在javascript中创建模型对象。我使用backbone.js 我想全局共享模型对象,因为我在许多js文件中需要该对象

 (function(){
     this.mymodel=Backbone.Model.extend({
            ----
            ----
     });
  return{
            var colobj = new mymodel;
  }
})

我正在另一个js文件中共享“colobj”对象,如下所示

(function(){
     var collectionobj = new colobj;
 });

但是这给了我错误这个例子中的错误

2 个答案:

答案 0 :(得分:3)

在我看来,你不明白什么是闭包,以及如何使用IIFE

你有几个选择可以做你想要的。

首先,您可以使用全局对象跨文件共享对象。像这样:

// model.js
(function(exports, Backbone, undefined) {
    var Model = Backbone.Model.extend({});

    exports.Model = Model;
})(window, Backbone);

// collection.js
(function(exports, Backbone, _, undefined) {
    var Model = exports.Model;
    var Collection = Backbone.Collection.extend({
        model: Model
        // ...
    });

    exports.Collection = Collection;
})(window, Backbone, _);

或者这个:

// model.js
Model = (function(Backbone, undefined) {
    var Model = Backbone.Model.extend({});

    return Model;
})(Backbone);

// collection.js
Collection = (function(Backbone, _, undefined) {
    var Collection = Backbone.Collection.extend({
        model: Model
        // ...
    });

    return Collection;
})(Backbone, _); 

或者您可以在全局空间中创建对象并将其用作命名空间。

// model.js
(function(App, Backbone, undefined) {
    var Model = Backbone.Model.extend({});

    App.Model = Model;
})(App = (window.App || {}), Backbone);

// collection.js
(function(App, Backbone, _, undefined) {
    var Model = App.Model;
    var Collection = Backbone.Collection.extend({
        model: Model
        // ...
    });

    App.Collection = Collection;
})(App = (window.App || {}), Backbone, _);

或者您可以将对象定义为AMD-modules,然后使用任何AMD加载程序。例如,如果您想使用require.js,您可以编写如下内容:

// main.js
require.config({
    paths: {
        'jquery': '/js/vendor/jquery.js',
        'underscore': '/js/vendor/underscore.js',
        'backbone': '/js/vendor/backbone.js',
        'model': '/js/model.js',
        'collection': '/js/collection.js'
    },
    shim: {
        backbone: {
            deps: ["underscore", "jquery"],
            exports: "Backbone"
        },

        underscore: {
            exports: "_"
        }
    }
});

// model.js
define([
    'jquery', 
    'underscore',
    'backbone'
], function($, _, Backbone){
    var Model = Backbone.Model.extend({});
    return Model;
});

// collection.js
define([
    'jquery', 
    'underscore',
    'backbone',
    'model'
], function($, _, Backbone, Model){
    var Collection = Backbone.Collection.extend({
        model: Model
    });
    return Collection;
});

答案 1 :(得分:1)

首先,你应该改变这一行:

var colobj = new mymodel;

var colobj = new this.mymodel;

问题是mymodel未定义,可能是您问题的根源。

此外,您的第一个colobj是模型的一个实例,因此它是一个对象而不是构造函数。这就是你第二次尝试实例化它的原因:

var collectionobj = new colobj;

它会抛出一个错误,因为浏览器认为你正在做类似的事情:

var collectionobj = new (new mymodel);

我建议你只将模型定义从一个闭包传递给另一个闭包:

//...
return{
        var colobj = this.mymodel;
}
//...

<强>更新
我很惊讶地看到我以前错过了这个 您将返回一个无效对象:

{var colobj = new mymodel;}

我认为你可能想要返回一个使用模型值散列colobj属性的对象。如果是这种情况,您只需返回此对象:

{colobj : this.mymodel};