Backbone.js 使用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 --- */ }); }); 页面加载时,项目中的所有模型都将被初始化(即,将对所

我有一个用requirejs构建的主干/木偶项目

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函数的相同结论。