Den*_*VDB 4 html javascript materialize meteor iron-router
我试图实现一个只有在用户登录时才能看到的下拉列表.下拉列表在"if"语句之外但不在内部时工作.显示按钮"Foo"和下拉按钮,但它不会"下拉".
了header.html
<!-- Header -->
<template name="header">
<nav>
<div class="nav-wrapper">
<a class="brand-logo" href="{{pathFor 'home'}}">Logo</a>
<ul id="nav-mobile" class="right hide-on-med-and-down">
{{#if currentUser}}
<!-- dropdown1 trigger -->
<li>
<a class="dropdown-button" href="#!" data-activates="dropdown1">
<i class="mdi-navigation-more-vert"></i>
</a>
</li>
<li><a href="#">Foo</a></li>
{{else}}
<li><a href="{{pathFor 'signin'}}">Sign in</a></li>
{{/if}}
<li><a href="{{pathFor 'about'}}">About</a></li>
</ul>
</div>
</nav>
<!-- dropdown1 structure -->
<ul id="dropdown1" class="dropdown-content">
<li class="signout"><a href="#!">Sign out</a></li>
</ul>
</template>
Run Code Online (Sandbox Code Playgroud)
header.js
Template.header.rendered = function () {
$(".dropdown-button").dropdown({
belowOrigin: true // Displays dropdown below the button
});
};
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?
当您的Template.header.onRendered生命周期事件首次被触发时,下拉HTML元素尚未插入到DOM中,因为{{#if currentUser}}尚未满足条件(在实际登录Meteor应用程序之前需要花费很少的时间,这就是为什么Meteor.user被动反应很方便! ).
这就是你的jQuery下拉列表初始化失败的原因:DOM还没有准备好!解决方案非常简单:重构您的Spacebars代码,将下拉标记放在自己的单独模板中:
<template name="dropdown">
<li>
<a class="dropdown-button" href="#!" data-activates="dropdown1">
<i class="mdi-navigation-more-vert"></i>
</a>
</li>
<li><a href="#">Foo</a></li>
</template>
Run Code Online (Sandbox Code Playgroud)
然后在您的标题模板中插入子模板:
{{#if currentUser}}
{{> dropdown}}
{{else}}
{{! ... }}
{{/if}}
Run Code Online (Sandbox Code Playgroud)
这样下拉列表将有自己的onRendered生命周期事件,只有在用户登录后才会触发,此时下拉DOM将准备就绪.
Template.dropdown.onRendered(function(){
this.$(".dropdown-button").dropdown({
belowOrigin: true // Displays dropdown below the button
});
});
Run Code Online (Sandbox Code Playgroud)
有时将代码重构为较小的子任务不仅仅是一种风格问题,而是使事情按照预期的方式工作.