javascript - Meteor session 设置/获取强制 html 重新呈现

标签 javascript meteor iron-router

我有一个页面运行时仅在客户端运行 Meteor.js。我正在使用 iron-router用于设置页面 URL。我在 before 部分设置 session 变量:

    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());
    }
}

现在,当我设置 session 变量时,它会更改某些定价的某些值,例如计算费用和税费:

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 会自动重新呈现依赖于特定键(员工编号)的部分,如果该键发生变化。然而,这段代码在以前版本的 meteor 上运行良好。最近行为是否发生了变化?我该如何解决这个问题?

最佳答案

您的 input#employee 不会通过更改 Session.get('employee-number') 重新呈现,因为它不依赖于该值或任何其他 Session 值。我的猜测是,您之前依赖于 DOM 更高层的某些东西,从而在 Session.get('employee-number') 更改时触发整个模板的重新呈现。

这是 Meteor 0.8+ 中的一个重大变化——响应式数据源的变化不会自动触发整个模板的重新渲染,而只会触发那些依赖于数据源的特定元素。所以 input#employee 没有被重新渲染。

我会 read here有关此更改的更多信息。

此外,作为旁注,Iron Router 的“before”钩子(Hook)已被弃用,取而代之的是“onBeforeAction”。这可能不是您问题的来源,因为“之前”将通过 Meteor 1.0 (see here) 得到支持。只是想指出它以面向 future 。

关于javascript - Meteor session 设置/获取强制 html 重新呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23668290/

相关文章:

meteor - 使用 Meteor 和 Iron Router 创建事件导航状态

javascript - 安装 iron :router in meteor app 后 Materialise 侧边栏导航停止工作

具有默认参数的 JavaScript 函数

javascript - jqModal 不工作

javascript - 在 webpack 2 配置中包含纯 JavaScript 文件

meteor - 您如何安全地注销并清除所有订阅?

meteor - 使用 Meteor Iron-router 中止导航

javascript - 检查给定的 DOM 元素是否已准备好

node.js - 由于缺少 MongoDB,无法在全新安装的 Ubuntu Linux 上运行 Meteor 应用程序

javascript - Meteor setPersistent 用于 CSS 样式