Javascript Meteor:DOM元素在Template.rendered回调函数中尚不存在
我正在用Meteor构建一个应用程序,我有一个菜单按钮,它是一个显示和隐藏边栏的切换。(绿色条) 加载页面或用户登录后,如果浏览器宽度大于768px,我想单击“菜单切换”按钮显示它 目前,我通过反应性地检查Meteor.user()来实现这一点,因为如果用户登录并且是第一次登录,则在加载页面后会调用该函数Javascript Meteor:DOM元素在Template.rendered回调函数中尚不存在,javascript,jquery,meteor,user-accounts,Javascript,Jquery,Meteor,User Accounts,我正在用Meteor构建一个应用程序,我有一个菜单按钮,它是一个显示和隐藏边栏的切换。(绿色条) 加载页面或用户登录后,如果浏览器宽度大于768px,我想单击“菜单切换”按钮显示它 目前,我通过反应性地检查Meteor.user()来实现这一点,因为如果用户登录并且是第一次登录,则在加载页面后会调用该函数 userEnabled = () -> if Meteor.user() console.log 'user Enabled called ' + menuOpen
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,则不会单击元素
So 2问题
1)客户端登录回调被调用两次
2)在单击元素之前,我必须使用setTimeout等待元素存在。
我如何解决这个问题
如果您需要我提供更多信息,请告诉我,非常感谢您的帮助。解决方案(使用Meteor.defer和回调函数):
请注意,在单击$('.show left')按钮之前,我没有使用setTimeout,而是使用Meteor.defer。defer将等待DOM完全更新并具有所需的所有元素。否则,在尝试访问渲染上的DOM元素时,如果没有此选项,它们最终可能无法工作!将Meteor.defer与回调一起使用,以使用DOM上的事件,或在呈现回调或onAfterAction函数中更新DOM
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()