Coffeescript 铁路由器闪烁问题

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

根据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})
我的代码专门用于在未定义特定聊天室时重定向到主页。它在一个非常恼人的问题上如预期的那样工作。有很多页面在闪烁。钩子似乎是先呈现
主页
页面,然后再按照逻辑将您放在正确的页面上

因此,当访问确实存在的聊天室时,它会在瞬间快速呈现主页,然后加载聊天室。当访问不存在的聊天室时,它会呈现主页,而不是快速重新呈现主页。在这两种情况下,都会出现闪烁,这使得这些页面非常讨厌使用

我是不是做错事了?还是有更好的方法避免闪烁

编辑:这仅在硬页面重新加载时发生

这是我根据第一个答案更新的代码,但我遇到了一个问题,即每个
房间名都被渲染,不存在的房间名不会被重定向到
主页

路由:存在于客户端/服务器文件夹之外的根级别

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