2014-11-04 59 views
3

我升級了我的應用程序到流星1.0並更新了我的router.js,因爲我不能使用.wait()anymore。然而,現在我的未找到的頁面在「真實頁面」出現之前彈出了一秒鐘。我怎樣才能解決這個問題?未找到頁面彈出一秒 - 流星 - 鐵 - 路由器

這裏是我的代碼:

this.route('gamePage', { 
     path: '/game/:slug/', 
     onBeforeAction: [function() { 
      this.subscribe('singlePlayer', this.params.slug); 
      var singlePlayer = this.data(); 
      if (singlePlayer) { 
       if (singlePlayer.upgrade) { 
        this.subscribe('upgrades', this.params.slug); 
       } 
      } 
      this.next(); 
     }], 
     data: function() { 
      return Games.findOne({slug: this.params.slug}); 
     }, 
     waitOn: function() { return [Meteor.subscribe('singleGame', this.params.slug)]} 
    }); 

任何幫助將不勝感激。

+0

什麼版本的鐵路由器?另外:爲什麼在'onBeforeAction'回調周圍使用數組(方括號)括號?我以前沒有看過這種語法。不過,我只使用了鐵路路由器0.9.4。 – 2014-11-10 01:13:19

回答

1

嘗試使用subscriptions模式代替。

this.route('gamePage', { 
    path: '/game/:slug/', 
    subscriptions: function() { 
     return Meteor.subscribe('singlePlayer', this.params.slug); 
    }, 
    onBeforeAction: function() {  
     var singlePlayer = this.data(); 
     if (singlePlayer) { 
      if (singlePlayer.upgrade) { 
       this.subscribe('upgrades', this.params.slug); 
      } 
     } 
     this.next(); 
    }, 
    data: function() { 
     return Games.findOne({slug: this.params.slug}); 
    }, 
    waitOn: function() { return [Meteor.subscribe('singleGame', this.params.slug)]} 
}); 

然而,重要的是你還包括loading插件採取loadingTemplate的優勢。

Router.configure({ 
    loadingTemplate: 'loading' // general purpose loading template 
}); 

// built in plugin.. surprisingly not clearly specified in current docs, but you can dive in the code for plugins. 
// https://github.com/EventedMind/iron-router/blob/devel/lib/plugins.js 

Router.onBeforeAction('loading', { only: ['gamePage'] }); // only show loading for pages with subscriptions 

Router.map(function() { 
    this.route('gamePage',{ 
     //... your other options here .. 
     loadingTemplate: 'gamePageLoading', // game Page dedicated loading markup. 
    }); 
}); 

另外還有this.ready()模式,如果你想留在你onBeforeAction實現。

this.route('gamePage', { 
    path: '/game/:slug/', 
    onBeforeAction: [function() { 
     this.subscribe('singlePlayer', this.params.slug); 

     if(this.ready()) { 
      var singlePlayer = this.data(); 
      if (singlePlayer) { 
       if (singlePlayer.upgrade) { 
        this.subscribe('upgrades', this.params.slug); 
       } 
      } 
      this.next(); 
     } else { 
      this.render('loading'); 
     } 

    }], 
    data: function() { 
     return Games.findOne({slug: this.params.slug}); 
    }, 
    waitOn: function() { return [Meteor.subscribe('singleGame', this.params.slug)]} 
}); 

來源:https://github.com/EventedMind/iron-router/blob/devel/Guide.md#subscriptions

我想,因爲.wait圖案被看作是不必要的鏈接這種變化是必要的,很容易出現(編碼)錯誤。此外,當重寫onBeforeAction時,明確處理.next()現在確保此掛鉤的正確時間(並且可能大部分,如果不是全部其他掛鉤)。

+0

非常感謝! :) – user3475602 2014-11-10 19:39:21