Coffeescript 铁路由器闪烁问题
根据Iron Router文档,这是您在尝试路由到没有相关数据的页面时如何处理路由的方法Coffeescript 铁路由器闪烁问题,coffeescript,meteor,iron-router,Coffeescript,Meteor,Iron Router,根据Iron Router文档,这是您在尝试路由到没有相关数据的页面时如何处理路由的方法 if Meteor.isClient Router.onBeforeAction('dataNotFound') Router.map -> @route 'chat', path: '/chat/:room_name' notFoundTemplate: 'home' data: -> Rooms.fi
if Meteor.isClient
Router.onBeforeAction('dataNotFound')
Router.map ->
@route 'chat',
path: '/chat/:room_name'
notFoundTemplate: 'home'
data: ->
Rooms.findOne({room_name: @params.room_name})
我的代码专门用于在未定义特定聊天室时重定向到主页。它在一个非常恼人的问题上如预期的那样工作。有很多页面在闪烁。钩子似乎是先呈现主页
页面,然后再按照逻辑将您放在正确的页面上
因此,当访问确实存在的聊天室时,它会在瞬间快速呈现主页,然后加载聊天室。当访问不存在的聊天室时,它会呈现主页,而不是快速重新呈现主页。在这两种情况下,都会出现闪烁,这使得这些页面非常讨厌使用
我是不是做错事了?还是有更好的方法避免闪烁
编辑:这仅在硬页面重新加载时发生
这是我根据第一个答案更新的代码,但我遇到了一个问题,即每个房间名都被渲染,不存在的房间名不会被重定向到主页
路由:存在于客户端/服务器文件夹之外的根级别
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({})
这种行为的可能原因是第一次呈现页面时订阅未准备就绪。解决方法是将订阅移动到路由器并等待它们:
Router.map ->
@route 'chat',
path: '/chat/:room_name'
notFoundTemplate: 'home'
onBeforeAction: ->
@subscribe('chatRooms').wait()
data: ->
Rooms.findOne({room_name: @params.room_name})
您还可以使用以下模式在帮助器中订阅:
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}}
在路由器中使用订阅会停止整个页面的加载,而在大多数情况下,只有该页面的少数部分实际上取决于订阅是否准备就绪。我觉得这是我应该做的,但刚刚实现它,我遇到了一个问题。现在我回到了每个chat/:room\u name
加载的地方,即使它不在数据库中。需要传递什么参数才能使订阅正常工作?如果只想获取当前聊天室,请传递@params.room\u name
。