扩展视图时扩展行为
Extending behaviors when extending views
任务是:
MyViewX 使用 BehaviorA 和 B
MyViewY 扩展了 MyViewX,
并使用 MyViewX 中的所有行为,加上 BehaviorC
// The following code works
//
var MyViewX = Marionette.ItemView.extend({
behaviors: {
BehaviorA: {},
BehaviorB: {}
}
});
var MyViewY = MyViewX.extend({
behaviors: {
BehaviorA: {},
BehaviorB: {},
BehaviorC: {}
}
});
问题:如何利用X中的行为定义,使得Y中不需要重复A和B?
// this is not good. It overrides X. Y has only C
var MyViewY = MyX.extend({
behaviors: {
BehaviorC: {}
}
});
// maybe something like this?
// but how exactly to get X's behaviors here?
var MyViewY = MyViewX.extend({
behaviors: _.extend{
BEHAVIORS_OF_THE_SUPER_OF_THE_CURRENT_CLASS,
{ BehaviorC: {} }
}
});
// this gives no errors,
// but A and B do not behave, as if they are not used.
//
var MyViewY = MyViewX.extend({
behaviors: { BehaviorC: {} },
initialize: function () {
var b = this.behaviors;
this.behaviors = _.extend(
MyViewY.__super__.behaviors,
b
);
}
});
您可以通过访问 prototype
来了解 MyViewX
的行为。使用您理想的解决方案,以下应该有效:
var MyViewY = MyViewX.extend({
behaviors: _.extend({},
MyViewX.prototype.behaviors,
{ BehaviorC: {} }
);
});
最后一个示例不起作用的原因是因为 Marionette 行为被添加到 Marionette.View 构造函数中的视图,该构造函数发生在调用 Backbone.View 构造函数之前13=] 最后。
任务是:
MyViewX 使用 BehaviorA 和 B
MyViewY 扩展了 MyViewX,
并使用 MyViewX 中的所有行为,加上 BehaviorC
// The following code works
//
var MyViewX = Marionette.ItemView.extend({
behaviors: {
BehaviorA: {},
BehaviorB: {}
}
});
var MyViewY = MyViewX.extend({
behaviors: {
BehaviorA: {},
BehaviorB: {},
BehaviorC: {}
}
});
问题:如何利用X中的行为定义,使得Y中不需要重复A和B?
// this is not good. It overrides X. Y has only C
var MyViewY = MyX.extend({
behaviors: {
BehaviorC: {}
}
});
// maybe something like this?
// but how exactly to get X's behaviors here?
var MyViewY = MyViewX.extend({
behaviors: _.extend{
BEHAVIORS_OF_THE_SUPER_OF_THE_CURRENT_CLASS,
{ BehaviorC: {} }
}
});
// this gives no errors,
// but A and B do not behave, as if they are not used.
//
var MyViewY = MyViewX.extend({
behaviors: { BehaviorC: {} },
initialize: function () {
var b = this.behaviors;
this.behaviors = _.extend(
MyViewY.__super__.behaviors,
b
);
}
});
您可以通过访问 prototype
来了解 MyViewX
的行为。使用您理想的解决方案,以下应该有效:
var MyViewY = MyViewX.extend({
behaviors: _.extend({},
MyViewX.prototype.behaviors,
{ BehaviorC: {} }
);
});
最后一个示例不起作用的原因是因为 Marionette 行为被添加到 Marionette.View 构造函数中的视图,该构造函数发生在调用 Backbone.View 构造函数之前13=] 最后。