Backbone.js 使用RequireJS初始化的所有主干模型
我有一个用requirejs构建的主干/木偶项目Backbone.js 使用RequireJS初始化的所有主干模型,backbone.js,requirejs,marionette,Backbone.js,Requirejs,Marionette,我有一个用requirejs构建的主干/木偶项目 define([ 'views/FormView', 'path/to/Model', ], function (FormView, Model) { "use strict"; return FormView.extend({ model: new Model(), /* --- rest of view stuff --- */ }); }); 页面加载时,项目中的所有模型都将被初始化(即,将对所
define([
'views/FormView',
'path/to/Model',
], function (FormView, Model) {
"use strict";
return FormView.extend({
model: new Model(),
/* --- rest of view stuff --- */
});
});
页面加载时,项目中的所有模型都将被初始化(即,将对所有模型调用initialize()),但视图只有在控制器实例化时才会被初始化
这些模型应该只在实例化之后才初始化,这让我很头疼
以前有人遇到过这种情况吗
更新:
感谢Kevin和Yura的回答,此代码有效:
define([
'views/FormView',
'path/to/Model',
], function (FormView, Model) {
"use strict";
return FormView.extend({
model: undefined,
initialize: function () {
this.model = new Model();
}
/* --- rest of view stuff --- */
});
});
模型只有在实例化之后才应该初始化
根据定义,它们将是
您正在上面的类定义中实例化模型,因此当定义FormView
代码时,它的初始值设定项将运行。您可能希望在控制器中创建视图时将模型作为选项传递,例如:
var my_model = new Model();
var my_view = new FormView({model: my_model});
模型只有在实例化之后才应该初始化
根据定义,它们将是
您正在上面的类定义中实例化模型,因此当定义FormView
代码时,它的初始值设定项将运行。您可能希望在控制器中创建视图时将模型作为选项传递,例如:
var my_model = new Model();
var my_view = new FormView({model: my_model});
你的问题是
model: new Model()
此requirejs模块加载到浏览器后立即运行。也就是说,当需要时,它返回扩展的FormView
,并且该原型用于FormView
的所有实例
此时,将实例化Model
的新实例对象,并将该实例用作FormView
的每个新实例的Model
属性
您可以做的不是直接使用model
属性扩展FormView
,而是将model
实例创建委托给FormView
实例的初始化:
define([
'views/FormView',
'path/to/Model',
], function (FormView, Model) { "use strict";
return FormView.extend({
initialize: function(){
/* Create property `model` whenever new instance of FormView is created */
this.model = new Model();
}
/* --- rest of view stuff --- */
});
});
下面是一个完整的工作示例来说明区别:
/**示例1**
使用'model'属性直接扩展并赋值
“Model”的新实例。后来你发现了同样的模型
实例用于所有“MyView”实例。
*/
var MyView=Backbone.View.extend({
型号:新主干。型号(),
render:function(){
this.el.text('I am'+this.model.get('name');
}
});
var myView1=新的MyView();
myView1.$el.appendTo(document.body);
var myView2=新的MyView();
myView2.$el.appendTo(document.body);
myView1.model.set({name:“Joe”});
myView2.model.set({name:“Bob”});
myView1.render();
myView2.render();
/**例2**
在initialize中使用'model'扩展将创建和分配
每次创建'MyOtherView'实例时,都会创建'model'的新实例。
*/
var MyOtherView=Backbone.View.extend({
初始化:函数(){
this.model=新主干.model();
},
render:function(){
this.el.text('I am'+this.model.get('name');
}
});
var myView1=新的MyOtherView();
myView1.$el.appendTo(document.body);
var myView2=新的MyOtherView();
myView2.$el.appendTo(document.body);
myView1.model.set({name:“Alice”});
myView2.model.set({name:“Catrine”});
myView1.render();
myView2.render()代码>
您的问题是
model: new Model()
此requirejs模块加载到浏览器后立即运行。也就是说,当需要时,它返回扩展的FormView
,并且该原型用于FormView
的所有实例
此时,将实例化Model
的新实例对象,并将该实例用作FormView
的每个新实例的Model
属性
您可以做的不是直接使用model
属性扩展FormView
,而是将model
实例创建委托给FormView
实例的初始化:
define([
'views/FormView',
'path/to/Model',
], function (FormView, Model) { "use strict";
return FormView.extend({
initialize: function(){
/* Create property `model` whenever new instance of FormView is created */
this.model = new Model();
}
/* --- rest of view stuff --- */
});
});
下面是一个完整的工作示例来说明区别:
/**示例1**
使用'model'属性直接扩展并赋值
“Model”的新实例。后来你发现了同样的模型
实例用于所有“MyView”实例。
*/
var MyView=Backbone.View.extend({
型号:新主干。型号(),
render:function(){
this.el.text('I am'+this.model.get('name');
}
});
var myView1=新的MyView();
myView1.$el.appendTo(document.body);
var myView2=新的MyView();
myView2.$el.appendTo(document.body);
myView1.model.set({name:“Joe”});
myView2.model.set({name:“Bob”});
myView1.render();
myView2.render();
/**例2**
在initialize中使用'model'扩展将创建和分配
每次创建'MyOtherView'实例时,都会创建'model'的新实例。
*/
var MyOtherView=Backbone.View.extend({
初始化:函数(){
this.model=新主干.model();
},
render:function(){
this.el.text('I am'+this.model.get('name');
}
});
var myView1=新的MyOtherView();
myView1.$el.appendTo(document.body);
var myView2=新的MyOtherView();
myView2.$el.appendTo(document.body);
myView1.model.set({name:“Alice”});
myView2.model.set({name:“Catrine”});
myView1.render();
myView2.render()代码>
问题出在哪里?mafoo,定义一个“未定义”的属性model
是一个好主意,就像您在更新中所做的那样。这无疑使代码更具可读性。有什么问题吗?mafoo,定义一个“未定义”的属性model
是一个好主意,就像您在更新中所做的那样。这无疑使代码更具可读性。我在阅读Kevin的响应后得出了使用initialize函数的相同结论。我在阅读Kevin的响应后得出了使用initialize函数的相同结论。