2014-09-21 53 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