我有一个Meteor.js运行的页面只在客户端上运行。我正在使用iron-router来设置网页网址。我在 之前 部分设置会话变量:
before: function () {
Session.set('employee-number', 0);
}
html有一个带文本框的部分
<div class="row-fluid employee-gift-main">
<div class="span4">
<label>
<span># Employees</span>
<input type="text" size="4" data-stripe="employee-text" class="employee-gift input-block-level" id="employee" placeholder="xx"/>
</label>
</div>
</div>
js文件有一个按键事件:
'keyup .employee-gift': function(event, template) {
if ((event.keyCode < 48 || event.keyCode > 57) && (event.keyCode != 27 && event.keyCode != 13 && event.keyCode != 10 && event.keyCode != 8)) {
$("#employee").val($("#employee").val().substring(0,$("#employee").val().length - 1));
}
else if (event.keyCode >= 48 || event.keyCode <= 57) {
Session.set('employee-number',$("#employee").val());
}
}
现在,当我设置会话变量时,它会更改某些定价的某些值,例如计算费用和税金:
sponsorFeeTotal: function() {
var adminFee = 0;
if(Session.get('firstTime'))
adminFee = 45*0.13;
if( Session.get('employee-number') == '')
return (Session.get('sponsorFee')+adminFee+parseFloat(Session.get('getTax'))).toFixed(2);
else
return (Session.get('sponsorFee')+parseInt(Session.get('employee-number'))*20*0.13+parseInt(Session.get('employee-number'))*20+adminFee+parseFloat(Session.get('getTax'))).toFixed(2);
},
geTax :function() {
var adminFee = 0;
if(Session.get('firstTime'))
adminFee = 45*0.13;
if( Session.get('employee-number') == '')
return (Session.get('getTax')+adminFee).toFixed(2);
else
return (Session.get('getTax')+adminFee+parseInt(Session.get('employee-number'))*20*0.13).toFixed(2);
},
employeeNumber: function() {
return parseInt(Session.get('employee-number'));
},
employeeNumberValue: function() {
return parseInt(Session.get('employee-number'))*20;
}
然后,get方法强制重新加载包括#employee字段在内的所有文本输入。据我所知,如果该键发生变化,meteor UI会自动重新呈现依赖于特定键(员工编号)的部分。但是,此代码与之前版本的流星一起工作正常。最近是否更改了行为,如何解决此问题?
答案 0 :(得分:1)
您的输入#员工不会通过更改Session.get('employee-number')来重新呈现,因为它不依赖于该值或任何其他会话值。我的猜测是,当Session.get('employee-number')发生变化时,您之前依赖于DOM上的某些东西触发重新呈现整个模板。
这是Meteor 0.8+的一个重大变化 - 无效数据源的变化不会自动触发整个模板的重新渲染,而只会触发那些依赖于数据源的特定元素。因此输入#manual不会被重新渲染。
我会read here了解有关此更改的更多信息。
另外,作为附注,Iron Router的'before'钩子被弃用,转而使用'onBeforeAction'。这可能不是您问题的根源,因为“之前”将通过Meteor 1.0(see here)得到支持。只是想指出它是为了面向未来。