如何在自身内部引用 Backbone/Marionette 视图?
How to reference a Backbone/Marionette View within itself?
MyView.js:
define(['app/models/MyModel'],
function (MyModel) {
return Mn.LayoutView.extend({
template: '#my-template',
className: 'my-classname',
regions: {
content: '.content-region',
panel: '.panel-region'
}
initialize: function () {
_.bindAll(this, 'childButtonClicked');
},
onShow: function () {
this.getRegion('content').show(new AnotherView());
},
childEvents: {
'some-child-click': 'childButtonClicked'
},
childButtonClicked: function (view) {
var newView = new MyView({
model: new MyModel({
title: view.model.get('title')
})
});
this.getRegion('panel').show(newView);
}
});
});
我正在尝试将 MyView 的实例嵌套在自身中。当我通过将所有内容转储到一个函数中来构建原型时,这工作正常,如下所示:
var MyView = Mn.LayoutView.extend({
...
childButtonClicked: function(view) {
var newView = new MyView({
...
现在我正试图将视图分离到它们自己的文件中并使用 require.js,我无法弄清楚 self-referential 视图的语法。
当我按原样 运行 这段代码时,我得到一个错误,如 'MyView is undefined'。
如果我像这样将它添加到需求 header 中:
define(['app/models/MyModel', 'app/views/MyView'],
function (MyModel, MyView) {
我收到错误 'MyView is not a function'。
编辑解决方案:
标记的解决方案工作正常,我最终使用了 obvious-in-hindslght:
define(['app/models/MyModel'],
function (MyModel) {
var MyView = Mn.LayoutView.extend({
template: '#my-template',
className: 'my-classname',
regions: {
content: '.content-region',
panel: '.panel-region'
}
initialize: function () {
_.bindAll(this, 'childButtonClicked');
},
onShow: function () {
this.getRegion('content').show(new AnotherView());
},
childEvents: {
'some-child-click': 'childButtonClicked'
},
childButtonClicked: function (view) {
var newView = new MyView({
model: new MyModel({
title: view.model.get('title')
})
});
this.getRegion('panel').show(newView);
}
});
return MyView;
});
您可以 require()
在您的模块中:var MyView = require(app/views/MyView);
.
所以想要一个更好的地方:
childButtonClicked: function (view) {
var MyView = require(app/views/MyView);
var newView = new MyView({
model: new MyModel({
title: view.model.get('title')
})
});
this.getRegion('panel').show(newView);
}
MyView.js:
define(['app/models/MyModel'],
function (MyModel) {
return Mn.LayoutView.extend({
template: '#my-template',
className: 'my-classname',
regions: {
content: '.content-region',
panel: '.panel-region'
}
initialize: function () {
_.bindAll(this, 'childButtonClicked');
},
onShow: function () {
this.getRegion('content').show(new AnotherView());
},
childEvents: {
'some-child-click': 'childButtonClicked'
},
childButtonClicked: function (view) {
var newView = new MyView({
model: new MyModel({
title: view.model.get('title')
})
});
this.getRegion('panel').show(newView);
}
});
});
我正在尝试将 MyView 的实例嵌套在自身中。当我通过将所有内容转储到一个函数中来构建原型时,这工作正常,如下所示:
var MyView = Mn.LayoutView.extend({
...
childButtonClicked: function(view) {
var newView = new MyView({
...
现在我正试图将视图分离到它们自己的文件中并使用 require.js,我无法弄清楚 self-referential 视图的语法。
当我按原样 运行 这段代码时,我得到一个错误,如 'MyView is undefined'。
如果我像这样将它添加到需求 header 中:
define(['app/models/MyModel', 'app/views/MyView'],
function (MyModel, MyView) {
我收到错误 'MyView is not a function'。
编辑解决方案:
标记的解决方案工作正常,我最终使用了 obvious-in-hindslght:
define(['app/models/MyModel'],
function (MyModel) {
var MyView = Mn.LayoutView.extend({
template: '#my-template',
className: 'my-classname',
regions: {
content: '.content-region',
panel: '.panel-region'
}
initialize: function () {
_.bindAll(this, 'childButtonClicked');
},
onShow: function () {
this.getRegion('content').show(new AnotherView());
},
childEvents: {
'some-child-click': 'childButtonClicked'
},
childButtonClicked: function (view) {
var newView = new MyView({
model: new MyModel({
title: view.model.get('title')
})
});
this.getRegion('panel').show(newView);
}
});
return MyView;
});
您可以 require()
在您的模块中:var MyView = require(app/views/MyView);
.
所以想要一个更好的地方:
childButtonClicked: function (view) {
var MyView = require(app/views/MyView);
var newView = new MyView({
model: new MyModel({
title: view.model.get('title')
})
});
this.getRegion('panel').show(newView);
}