我的问题是我想在javascript中创建模型对象。我使用backbone.js 我想全局共享模型对象,因为我在许多js文件中需要该对象
(function(){
this.mymodel=Backbone.Model.extend({
----
----
});
return{
var colobj = new mymodel;
}
})
我正在另一个js文件中共享“colobj”对象,如下所示
(function(){
var collectionobj = new colobj;
});
但是这给了我错误这个例子中的错误
答案 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};