铁路由器闪烁问题

时间:2014-06-25 20:37:50

标签: coffeescript meteor iron-router

根据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({})

2 个答案:

答案 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})
相关问题