2014-06-30 36 views
0

我正在用Meteor创建一个应用程序,我有一个菜单按钮,它是一个显示和隐藏边栏的切换按钮。 (绿色条)流星:DOM元素在Template.rendered回调函数中还不存在

页面加载完成或用户登录后,如果浏览器宽度大于768px,我想单击菜单切换按钮以显示它。

目前,我通过反应性地检查Meteor.user()来实现这一目标,因为如果用户登录并且用户第一次登录,则在加载页面后调用Meteor.user()。

userEnabled =() -> 
    if Meteor.user() 
    console.log 'user Enabled called ' + menuOpen 
    if $(window).width() > 768 
     if menuOpen is false 
     console.log 'reached inside' 
     # Need to use setTimeout before clicking because .show-left element has just been added back to the screen, so we need to wait. I don't like this very much, need to find better method. 
     setTimeout -> 
      $('.show-left').click() 
     , 600 

Deps.autorun() -> 
    userEnabled() 

的问题是,在页面加载某些原因,userEnabled()有时被称为两倍,因此它的开放和关闭边栏。另一个问题是不得不使用setTimeout方法来等待菜单切换元素的存在,所以我可以点击它。没有setTimeout,元素不会被点击。

所以2个问题

1)客户端登录的回调被调用两次

2)我必须使用setTimeout的等待元素点击之前存在。

我该如何解决这个问题?

让我知道你是否需要我提供更多信息,并非常感谢你的帮助。

回答

1

解决方案(使用Meteor.defer与回调函数):

userEnabled =() -> 
    if Meteor.user() 
    if $(window).width() > 768 
     if !$('.show-left').hasClass 'active' 
     # Need to use setTimeout before clicking because .show-left element has just been added back to the screen, so we need to wait. I don't like this very much, need to find better method. 
     Meteor.defer -> 
      $('.show-left').click() 

Router.map -> 
    @route 'template1', 
    path: '/template1', 
    @route 'addAndSearchPosts', 
    path: '/', 
    onAfterAction: -> 
     userEnabled() 

通知,而不是点击$之前使用的setTimeout( '显示左。')按钮,我用Meteor.defer。 Meteor.defer等待DOM完全更新并且具有所有需要的元素。否则,当尝试访问渲染上的DOM元素时,如果没有这个,他们最终可能无法工作!使用带回调的Meteor.defer在DOM上使用事件,或者在呈现的回调函数或onAfterAction函数中更新DOM。

相关问题