2014-09-21 48 views
1

由於流星的性質,其中Template.<name>.rendered在收集之前執行,我可以使用鐵路由器waitOn鐵路由器waitOn在Chrome中不起作用

這是在呈現頁面之前等待播放列表啓用。它適用於Firefox和IE(具有諷刺意味),但從未在Chrome中使用。

Chrome控制檯指出的錯誤是Cannot read property 'uploadType' of undefined這很有意義,因爲對象/集合無法在Chrome中加載。

我該怎麼做才能遇到這個問題? FYI的waitOn是這樣的:

//router.js

this.route('videoPlayer',{ 
    path:'/video', 
    waitOn: function(){ 
     return [Meteor.subscribe('videoPlaylist'), Meteor.subscribe('video')]; 
    } 
}); 

它不單獨預訂時甚至工作。

+0

有您激活默認'使用'Router.onBeforeAction(「loading」)加載'鉤子;'? – saimeunt 2014-09-21 01:43:53

+0

@saimeunt nope。我應該在哪裏添加它?據我所知,waitOn是用來保存渲染的。 – 2014-09-21 01:45:17

+0

你可以把它放在你的全局路由器配置中。我認爲這個問題可能來自於Chrome瀏覽器JS引擎比Firefox/IE更快,從而在收集數據仍然不可用的狀態下觸發第一個有問題的代碼評估。 waitOn應該返回你想要等待的訂閱,但它需要默認的加載鉤子,它負責延遲渲染,直到數據準備就緒。 – saimeunt 2014-09-21 01:50:29

回答

0

不知何故,這很奇怪。它的工作原理(再次記住,在Chrome中它不起作用,FF和IE的其餘部分都很好,多麼有趣的世界)。

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

所以這讓我想知道是不是waitOn應該足以做這份工作?

+0

真的嗎?這對我有用嗎?對我來說不......我仍然有行動方法在我的路線... – TJR 2014-09-21 14:17:46

+0

我有路線中的waitOn和動作,然後它在Chrome中工作。我也有'route.onBeforeAction(「loading」);'在地圖聲明之後。奇怪的是世界。 – 2014-09-21 14:33:31

+0

這很奇怪!我也使用waitOn和動作(在這裏拿一個liik:https://github.com/EventedMind/iron-router/issues/845),它不起作用!有時我真的很討厭流星...... – TJR 2014-09-21 14:34:27

0

它不是一個錯誤,而是一個預期的行爲,鐵路由器希望你實現某種類型的「加載」,在定義路由器之後添加這一行,waitOn將按照你的預期工作。

Router.onBeforeAction("loading"); 
+0

這對我的情況沒有幫助......我有同樣的問題並使用Router.onBeforeAction('loading')。(是的,有一個加載模板定義) – TJR 2014-09-21 04:49:29

+0

當你使用上面的代碼時,你並不需要定義一個加載模板,而是加載模板,而不是刪除加載模板(或者只是重命名它)並看看它是否有效。 – 2014-09-21 05:32:09

+0

不適合我。 Chrome仍然沒有等待數據。 – 2014-09-21 12:16:52

0

我不知道如果這有助於你...我有同樣的問題,但是當我重裝正是我的模板呈現前需要的數據對象的頁面的問題不只是出現。

當我在另一個頁面上,通過點擊一個鏈接(在你的情況下,這樣的鏈接:<a href="{{pathFor 'videoPlayer'}}">Videos</a>),一切正常。但是當我(你的情況)/video和重新加載頁面時,你所描述的錯誤出現在我的情況...非常strang和令人沮喪...

+0

這將是醜陋的。我關心的是爲什麼這些瀏覽器的行爲不一樣。 IE和Firefox按預期工作,但不是Chrome。 – 2014-09-21 12:37:31

+0

我在這裏打開一個新問題:https://github.com/EventedMind/iron-router/issues/845 – TJR 2014-09-21 13:39:36

0

我遇到了同樣的問題之前,我發現從鐵路由器EventedMind


的開發商對於TL這個視頻; DW

Router.onBeforeAction(function(pause) { 
 
    if (!this.ready()) { 
 
    this.render('Loading'); 
 
    pause(); 
 
    } 
 
}); 
 

 

 
Router.map(function() { 
 
    return this.route('home', { 
 
    path: '/', 
 
    waitOn: function() { 
 
     return Meteor.subscribe('roomList'); 
 
    }, 
 
    action: function() { 
 
     this.render('home'); 
 
    } 
 
    }); 
 
});

+0

確切的;你做了什麼(參見上面我自己的回答)。關鍵是,在文檔中它說waitOn是在渲染之前等待集合準備就緒,並且它在Firefox和IE中執行,但在Chrome中以某種方式它需要所有3種機制才能工作(waitOn,action,onBeforeAction)我確信有什麼問題與Chrome。 – 2014-09-22 00:51:02

+0

好吧,我最後的猜測是確保你將'暫停'參數傳遞給'onBeforeAction',如果子沒有準備好暫停動作,直到它準備好。當它準備好然後渲染你的模板。對不起,如果這不幫助我只是拋出建議,我在手機上,所以我不能正確輸入上面的代碼。 – jrudio 2014-09-22 02:02:40

+0

@ user4043200是的,它的工作原理,但你必須通過三種方式使它在Chrome中工作。 – 2014-09-22 23:31:31