我正在使用Meteor 0.5.4我刚遇到Meteor的Session.set()时出现了一个奇怪的问题。
我想在用户点击模板实例时显示一个简单的模态对话框。
当用户点击模板实例时,我正在使用Template的事件映射将一些信息设置为Session。
Template.Orders.events({
'click' : function () {
Session.set("OrderName", this.name);
}
});
模态对话模板然后在会话中显示数据集:
Template.OrderDialogue.OrderName = function() {
return Session.get("OrderName");
}
最后这是我的JQuery代码
Template.Orders.rendered = function() {
jQuery('a[rel*=leanModal]').leanModal();
}
当我使用Session.set()时 - 如上面在Template.orders的click事件处理程序中所示 - JQuery插件在第一次单击模板实例时不显示模态对话框,但仅在第二次单击该确切实例时显示。只需点击两次模板实例即可获得模态对话。
当我删除Session.set()时,一切正常 - 首次点击时会显示模态对话,因为它应该有效。
调试输出显示第一次单击时正确设置了会话值。
Session.set()如何干扰我的JQuery插件?
答案 0 :(得分:2)
leanModal
在Meteor引擎将新内容反应性地输入其中之前显示OrderDialogue
的HTML内容,因此关键是将leanModal
点击包裹在setTimeout
中确保反应已经发生。
假设你有:
<template name="OrderDialogue">
<div id="overlay_content">
<h1>{{OrderName}}</h1>
</div>
</template>
<template name="Orders">
{{#each order}}
<a href="#overlay_content" rel="leanModal">{{name}}</a>
{{/each}}
</template>
你的javascript:
Template.Orders.events({
'click' : function () {
Session.set("OrderName", this.name);
}
});
Template.OrderDialogue.OrderName = function() {
return Session.get("OrderName");
}
Template.Orders.rendered = function() {
$("a[rel*=leanModal]").leanModal();
}
然后你必须在click事件处理程序上使用setTimeout
破解leanmodal小部件,以便在事件冒泡之前给出反应性片刻以呈现OrderName
内容。
假设this is the script,请在此脚本中包含点击处理程序(从第23行开始),如下所示:
$(this).click(function(e) {
setTimeout(function() {
var modal_id = $(this).attr("href");
...
}, 1);
});