Meteor JS iron-router: Споделяне на общи „данни“ между маршрути

В момента ето как изглежда моят рутер:

Router.map(function(){
  this.route('Home',{
    path:'/',
    template:'home',
    waitOn: function(){

    },
    data: function(){
      if(Meteor.userId()){
        var idOfOwner = Meteor.userId()

        var count = BirthDetails.find({idOfOwner: idOfOwner}).count();

        var hasBirthDetails;
        if(count > 0){
          hasBirthDetails = true;
        }else{
          hasBirthDetails = false;
        }
      }

      return {
        birthDetails: BirthDetails.find({
          idOfOwner: idOfOwner,
        }),

        hasBirthDetails: hasBirthDetails
      };

    }
  })

  this.route('Settings', {
    path: '/settings',
    template: 'settings',
    waitOn: function(){
      console.log('settings waitOn');

      //return Meteor.subscribe("userData");
    },
    data: function(){
      if(Meteor.userId()){
        var idOfOwner = Meteor.userId()

        var count = BirthDetails.find({idOfOwner: idOfOwner}).count();

        var hasBirthDetails;
        if(count > 0){
          hasBirthDetails = true;
        }else{
          hasBirthDetails = false;
        }
      }

      return {
        birthDetails: BirthDetails.find({
          idOfOwner: idOfOwner,
        }),

        hasBirthDetails: hasBirthDetails
      };


    }
  });

  this.route('Charts', {
    path:'/charts/:chart',
    template: 'charts',
    data: function(){

      Session.set("chartToDraw", this.params.chart);
      var birthInfo = Session.get('data');


      console.log('chart chart chart');
      console.log('inside Charts this.params.chart ' + this.params.chart);
      console.log('birthInfo');
      console.log(birthInfo);

      if(Meteor.userId()){
        var idOfOwner = Meteor.userId()

        var count = BirthDetails.find({idOfOwner: idOfOwner}).count();

        var hasBirthDetails;
        if(count > 0){
          hasBirthDetails = true;
        }else{
          hasBirthDetails = false;
        }
      }



      return {
        div: this.params.chart,
        birthInfo: birthInfo,
        birthDetails: BirthDetails.find({
          idOfOwner: idOfOwner,
        }),

        hasBirthDetails: hasBirthDetails
      };
    }
  });

  this.route('Factors', {
    path:'/factors/:factor',
    template: 'factors',
    data: function(){

      console.log('data of factors');

      if(Meteor.userId()){
        var idOfOwner = Meteor.userId()

        var count = BirthDetails.find({idOfOwner: idOfOwner}).count();

        var hasBirthDetails;
        if(count > 0){
          hasBirthDetails = true;
        }else{
          hasBirthDetails = false;
        }
      }


      var factorToDisplay = this.params.factor;

      console.log(factorToDisplay);

      var factorData = Session.get(factorToDisplay);

      console.log(factorData);

      var hasFactorData;
      if(typeof factorData === 'undefined'){

      }else{
        hasFactorData = true;
      }

      return {
        hasFactorData : hasFactorData,
        factor: this.params.factor,
        factorData : factorData,
        hasBirthDetails: hasBirthDetails,
        birthDetails: BirthDetails.find({
          idOfOwner: idOfOwner,
        }),
      }


    }
  });

  this.route('Data', {
    path: '/data',
    template: 'data',
    waitOn: function(){
      //return [Meteor.subscribe("name", argument);]
      //return [Meteor.subscribe("birth_details")];

    },
    data: function(){
      if(Meteor.userId()){
        var idOfOwner = Meteor.userId()

        var count = BirthDetails.find({idOfOwner: idOfOwner}).count();

        var hasBirthDetails;
        if(count > 0){
          hasBirthDetails = true;
        }else{
          hasBirthDetails = false;
        }
      }

      return {
        birthDetails: BirthDetails.find({
          idOfOwner: idOfOwner,
        }),

        hasBirthDetails: hasBirthDetails
      };
    }

  });


});

Както можете да видите, има няколко повторения на кода, който е подобен на този:

if(Meteor.userId()){
        var idOfOwner = Meteor.userId()

        var count = BirthDetails.find({idOfOwner: idOfOwner}).count();

        var hasBirthDetails;
        if(count > 0){
          hasBirthDetails = true;
        }else{
          hasBirthDetails = false;
        }
      }

      return {
        birthDetails: BirthDetails.find({
          idOfOwner: idOfOwner,
        }),

        hasBirthDetails: hasBirthDetails
      };

Как да избегна повтарянето на код в различни маршрути? В идеалния случай бих искал да го имам на едно място, което да може да се използва от много маршрути. По този начин не е необходимо да променям много различни места, ако реша да направя малки промени в повтарящия се код.... Как да направя това?

Причината, поради която не съм използвал RouteController, е, че за някои от маршрутите ще трябва да добавя още данни, които да бъдат върнати във функцията за данни на рутера.....но може би просто не знам как да използвам RouteController е за решаване на този вид проблем....

Как да изчистя кода по-горе?


person preston    schedule 28.08.2015    source източник
comment
Въпреки че това няма да ви хареса твърде много, бих предложил да преместите всички данни, обвързани с вашите шаблони, в абонаменти на ниво шаблон и да избягвате управлението на данни и железните рутер контролери заедно.   -  person bigmadwolf    schedule 28.01.2016


Отговори (1)


Може да имате код като този:

BirthController = RouteController.extend({
  waitOn: function () { return Meteor.subscribe('birth', idOfOwner); },

  data: function () { return BirthDetails.findOne({_id: idOfOwner}) },

  action: function () {
    this.render();
  }
});

Тогава...

Router.route('/birthday, {
  name: 'birth.details',
  controller: 'BirthController'
});

Забележка: това е примерен код, без да виждате вашите действителни маршрути и шаблони.

person ilrein    schedule 28.08.2015
comment
Да, това е стандартният начин за използване на RouteController. Но предполагам, че въпросът ми е... да кажем, че имам друг маршрут, наречен „anotherbirthday“, който използва същите данни в BirthController плюс още някои... как да добавите това „още малко“ към BirthController, без да засягате маршрута /birthday, който използва BirthController, но не се нуждае от „още малко“ данни, които използва „още един рожден ден“? - person preston; 28.08.2015
comment
Можете да използвате _extend или __super__, вижте stackoverflow.com/questions/24223268/ - person ilrein; 28.08.2015
comment
Отговорът на @ilrein е правилен по отношение на контролерите и разширяването им. Обърнете внимание, че можете също да дефинирате js функция (като тази, предоставена от @thenchanter) във вашия router.js файл и да я използвате от всеки от вашите маршрути. - person Michel Floyd; 30.08.2015