【问题标题】:Iron-Router flickering issueIron-Router闪烁问题
【发布时间】:2014-08-16 13:44:06
【问题描述】:

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

【问题讨论】:

    标签: coffeescript meteor iron-router


    【解决方案1】:

    该行为的可能原因是第一次呈现页面时订阅尚未准备好。解决方法是将您的订阅移动到路由器并等待它们:

    Router.map ->
    
      @route 'chat',
        path: '/chat/:room_name'
        notFoundTemplate: 'home'
        onBeforeAction: ->
          @subscribe('chatRooms').wait()
        data: ->
          Rooms.findOne({room_name: @params.room_name})
    

    【讨论】:

    • 我觉得这是我应该做的,但是刚刚实现它我遇到了问题。现在我回到了每个 chat/:room_name 加载的位置,即使它不在数据库中。订阅需要传递什么参数才能正常工作?
    • 如果您只想获取当前聊天室,请传递@params.room_name
    【解决方案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}}
    

    在路由器中使用订阅会阻止整个页面的加载,而在大多数情况下,该页面只有几个部分实际上依赖于准备就绪的订阅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-29
      • 2015-01-04
      • 2016-03-06
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多