Iron Router在路由控制器上扩展数据选项

时间:2014-06-14 19:03:48

标签: inheritance meteor iron-router

有没有办法在使用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: {}
        }
   }
});

编辑:

使用underscoreextend函数继承原型函数后,我仍然无法继承使用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'})
            });
});

4 个答案:

答案 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 }}