0

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

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

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

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

但这给了我错误这个例子有什么问题

4

2 回答 2

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 模块,然后使用任何 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;
});
于 2012-06-06T13:18:32.997 回答
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};
于 2012-06-06T12:33:38.703 回答