2015-08-28 2 views
0

В настоящее время это, как мой маршрутизатор выглядит следующим образом:Метеор JS железо-маршрутизатор: Совместный общее «данные» между маршрутами

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 для решения такого рода проблем ....

Как очистить код выше?

+0

Хотя вам не понравится это слишком много, я бы предложил переместить любые данные, привязанные к вашим шаблонам, в подписки на уровне шаблонов и избежать управления данными и контроллеров железных маршрутизаторов. – pushplaybang

ответ

0
function get (type) { 
var birthInfo = Session.get('data'); 
var idOfOwner = Meteor.userId() 
this.BirthDetails = BirthDetails.find({idOfOwner: idOfOwner}).count(); 
this.birthInfo: = birthInfo; 
return { 
div: this.params.chart, 
birthInfo: birthInfo, 
birthDetails: BirthDetails.find({ 
idOfOwner: idOfOwner, 
}), 
    hasBirthDetails: hasBirthDetails 
    }; 
} 
} 
0

Вы могли бы иметь некоторый код, как это:

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' 
}); 

Примечание: это пример кода, не видя ваши фактические маршруты и шаблоны.

+0

Да, это стандартный способ использования RouteController. Но я предполагаю, что мой вопрос ... скажем, у меня есть еще один маршрут под названием «anotherbirthday», который использует те же данные в BirthController и еще несколько ... как добавить это «еще несколько» в BirthController, не затрагивая маршрут/день рождения, использует BirthController, но не нуждается в «некоторых более» данных, которые использует «другой день рождения»? – preston

+1

Вы можете использовать '_extend' или' __super__', см. Http://stackoverflow.com/questions/24223268/ironrouter-extending-data-option-on-route-controller – ilrein

+0

@ Ответ ilrein правильный с точки зрения контроллеров и расширяя их. Обратите внимание, что вы также можете определить функцию js (например, предоставленную @thenchanter) в файле router.js и использовать ее с любого из ваших маршрутов. –

Смежные вопросы