根据Iron-Router文档,这是在尝试路由到没有与之关联的数据的页面时如何处理路由。
if Meteor.isClient
Router.onBeforeAction('dataNotFound')
Router.map ->
@route 'chat',
path: '/chat/:room_name'
notFoundTemplate: 'home'
data: ->
Rooms.findOne({room_name: @params.room_name})
我的代码专门用于在未定义特定聊天室时重定向到主页。它按预期工作,有一个非常烦人的问题。有很多页面闪烁正在进行中。钩子似乎首先呈现home
页面,而不是通过逻辑来让你登陆到右页。
因此,当访问确实存在的聊天室时,它会快速呈现主页,而不是加载房间。当访问不存在的聊天室时,它正在呈现主页,而不是快速重新呈现它。在这两种情况下都会发生闪烁,使得这些页面使用起来非常烦人。
我只是以错误的方式做这件事吗?或者有更好的方法来避免闪烁吗?
编辑:这只发生在重页加载
上以下是基于第一个答案的更新代码,但我遇到的问题是,每个room_name
都会被渲染,而不存在的代码不会被重定向到home
路由:存在于客户端/服务器文件夹之外的根级别
if Meteor.isClient
Router.onBeforeAction('dataNotFound')
Router.map ->
roomExists = undefined
@route 'chat',
path: '/chat/:room_name'
notFoundTemplate: 'home'
onBeforeAction: ->
@subscribe('rooms').wait()
data: ->
Rooms.findOne({room_name: @params.room_name})
服务器代码
Meteor.publish 'rooms', () ->
Room.find({})
答案 0 :(得分:2)
您还可以使用以下模式订阅帮助程序:
Template.someTemplate.helper = function() {
var ready = Meteor.subscribe('somePublish').ready();
var data = collection.find({_id: this.id});
return {
ready: ready,
data: data
};
};
在模板html中,您将执行此操作:
{{#with helper}}
{{#if ready}}
{{Dostuff with your data}}
{{else}}
{{>spinner}} Loading...
{{/if}}
{{/with}}
使用路由器中的订阅可以阻止整个页面加载,而在大多数情况下,该页面的只有几个部分实际上依赖于该订阅准备就绪。
答案 1 :(得分:0)
该行为的可能原因是第一次呈现页面时订阅尚未就绪。解决方法是将您的订阅移动到路由器并等待它们:
Router.map ->
@route 'chat',
path: '/chat/:room_name'
notFoundTemplate: 'home'
onBeforeAction: ->
@subscribe('chatRooms').wait()
data: ->
Rooms.findOne({room_name: @params.room_name})