有没有办法在使用IronRouter和data
时扩展RouteController
选项,当我从超级控制器继承时它似乎被覆盖,子控制器不会扩展已定义的data
属性。我在路由上遇到yieldTemplates
选项的类似问题,并使用了解决方法(下划线_extends),但在这种情况下它不起作用:
ApplicationController = RouteController.extend({
data: function(){
return {
user: Meteor.user()
}
}
});
ChildController = ApplicationController.extend({
data: function(){
return {
// I expect to inherit Meteor.User ?????
someData: {}
}
}
});
编辑:
使用underscore
和extend
函数继承原型函数后,我仍然无法继承使用route
ChildController
定义
this.route('someRoute', {
template: 'task_template',
//tasks is not available on the template
data: function () {
var base = ChildController.data.call(this);
console.log(base);
return _.extend(base, {
tasks: Tasks.find({state: 'Open'})
});
});
答案 0 :(得分:8)
我在制作应用中使用类似的东西:
Router.route('/test/:testparam', {
name: 'test',
controller: 'ChildController'
});
ParentController = RouteController.extend({
data: function() {
console.log('child params: ', this.params);
return {
foo: 'bar'
};
}
});
ChildController = ParentController.extend({
data: function() {
var data = ChildController.__super__.data.call(this);
console.log(data);
return data;
}
});
使用__super__
似乎可以解决问题!
您可以使用_.extend扩展数据(http://underscorejs.org/#extend)
答案 1 :(得分:3)
要添加到所选答案,请注意,如果您使用的是Coffeescript,则以下内容会产生相同的结果:
class @ChildController extends ParentController
data: -> super()
# or if you want to add to it:
data: ->
_.extend super(), { extraThing: 'some value' }
答案 2 :(得分:1)
我认为_.extends
也适用于这种情况:
ChildController = ApplicationController.extend({
data: function() {
var base = ApplicationController.data.call(this);
return _.extends(base, {
someData: {},
});
}
});
答案 3 :(得分:0)
可能获得相同结果的另一个选项是在父控制器上定义一个方法,然后使用 super 调用它而不扩展任何内容。每个控制器的工作量稍微多一点,但更容易追溯应用。此外,它使您的子控制器的方法可选,而不是默认情况。
ApplicationController = RouteController.extend({
waitOn: function() {
return [Meteor.subscribe('customUserPublish')];
},
GetProfileWithEmail: function(){
var user = Meteor.user();
var profile = user.profile;
profile.email = user.emails[0].address;
return profile;
}
});
ProfileController = ApplicationController.extend({
waitOn: function() {
return [Meteor.subscribe('anotherCollectionPublish')];
},
data: function(){
return {
profile: function(){
var profile = ApplicationController.__super__.GetProfileWithEmail.call(this);
console.log('profile from super', profile);
return profile;
}
}
}
});
请记住,您还必须订阅已发布的集合,我相信您需要使用waitOn数组选项,以便它能正确合并子服务(诚然,我总是使用数组格式,因此YMMV)。您可以使用{{#with profile}} ... {{/ with}}访问模板中的数据,或者如果您使用{{#each profile}}获取对象数组... {{/ each }}