2014-09-19 2 views
2

Обновление: это было решено, и код был изменен с учетом изменений, которые я добавил. Я также настоятельно рекомендую прочитать комментарий ниже этого сообщения. Некоторые изменения приходят в IronRouter, о чем мы должны помнить.Meteor ironrouter - коллекция возвращает undefined, хотя я звоню waitOn()

Решающим вещь, чтобы добавить следующие строки в функции данных:

if(!this.ready()) { 
    return; 
} 

У меня возникли проблемы с IronRouter в моем приложении. Код ниже:

/** 
* Project list view (all projects) with optional 
* filter parameter for showing projects only by 
* their category name. 
*/ 
this.route('list', { 
    path: '/:_category_slug?', 
    template: 'template_main', 
    action: function() { 
     if(this.ready()) { 
      this.render(); 
     } 
    }, 
    waitOn: function() { 
     return [ 
      Meteor.subscribe('projects'), 
      Meteor.subscribe('formations'), 
      Meteor.subscribe('categories') 
     ]; 
    }, 
    data: function() { 
     if(!this.ready()) { 
      return; 
     } 

     if(this.params._category_slug) { 
      /** 
      * Building up the query given the category slug and the language 
      */ 
      var query = {}; 
      query['slug.' + App.language] = this.params._category_slug; 

      /** 
      * Grab the category given the query 
      */ 
      var category = App.models.categories.findOne(query); 

      console.log(category); 

      return App.models.projects.find({}).fetch(); 

     } 
     else { 
      return App.models.projects.find({}).fetch(); 
     } 
    }, 
    yieldTemplates: { 
     'components_header': {to: 'header'}, 
     'views_list': {to: 'content'}, 
     'components_footer': {to: 'footer'} 
    } 
}); 

То, что я пытаюсь сделать, это получить категорию из категории слизняка, так что я могу получить доступ к его идентификатору, который нужен мне для другого запроса.

Проблема заключается в том, что когда я перезагружаю страницу, и приведенный выше путь соответствует, этот маршрут, кажется, запускается три раза, и при первом входе в переменную категории на консоли возвращается неопределенный, а затем еще два раза , фактическая категория распечатана.

Я ожидал бы, что функция waitOn() заполнила бы все категории к моменту достижения функции данных, поэтому я могу получить доступ к данным моей категории с запросом в первый раз, но этого не происходит.

Может ли кто-нибудь увидеть что-либо очевидное в моем коде, что может вызвать эту проблему, и почему маршрут запускается три раза?

Я использую последнюю версию IronRouter (iron: [email protected]) и Meteor (METEOR @ 09.2.2).

ответ

2

При использовании iron:router < = 0.9.3 необходимо активировать по умолчанию loading сцепите для того, чтобы получить ожидаемое поведение ОЖИДАНИЯ для подписки, чтобы быть готовым до рендеринга шаблонов.

Добавить это в коде конфигурации маршрутизатора:

Router.onBeforeAction("loading"); 

Это означает, что вы больше не должны обеспечить action функцию делает логику ожидания (рендеринг шаблонов только тогда, когда WaitList готов).

Однако функция data будет еще дозвонилась первоначально, когда подписка не готова, так что вы должны сделать сам проверить:

data:function(){ 
    if(!this.ready()){ 
    return; 
    } 
    // return actual data when ready 
} 

Много вопросов о iron:router всплыли в отношении такого поведения loading крючка, и, честно говоря, это правда, что это броско, потому что, когда вы используете waitOn, вы ожидаете, что ваш RouteController действительно ПОДОЖДИТЕ эти подписки перед отображением шаблонов, не так ли?

Именно поэтому в последнем «неустойчивом» выпуске iron:[email protected] крюк loading автоматически добавляется для вас, когда он обнаруживает, что вы используете waitOn.

Я настоятельно рекомендую вам перейти на iron:[email protected], чтобы ознакомиться с новейшим API, в нем есть полный переписываемый и приятный документ, который является актуальным.

https://github.com/iron-meteor/iron-router/blob/devel/Guide.md

Это в основном обратно совместимы с несколькими подводных камней, в частности, он требует, чтобы определить все свои маршруты вместе с RouteController с в папке lib/ так, что она доступна для клиента и сервера.

+0

Благодарим за быстрый ответ. Это решило проблему. – matfin

+0

Добавлены комментарии относительно самой последней версии «iron: router». – saimeunt

+0

Привет, эта ссылка для github 404ing на данный момент :(Я с нетерпением ждал ее чтения ха-ха :) – lol

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