【问题标题】:Session variable not being picked up in meteor helper流星助手中未拾取会话变量
【发布时间】:2016-11-18 12:01:53
【问题描述】:

我有一个选择下拉菜单。更改事件触发要设置的会话变量。我想使用这个会话变量来填充一个表,但是,模板没有读取会话变量。我哪里错了?

<template name ='defaultTemplate'>
        <label for="Schema" class="control-label">Select the Schema</label>
        <select required="true"  class="form-control" id="schemaNameId">
            <!-- <option default>Select Schema </option> -->
            {{ #each schemaNames}}
            <option value="{{schemaName}}">{{schemaName}}</option>
            {{/each}}
        </select>

此时的控制台日志,显示未定义。从下拉列表中选择某些内容后,该值将设置为会话变量。

下表是上述模板的延续。但是,控制台日志似乎没有打印任何与 schemaLabel helper 相关的内容

<table class="table table-bordered table-condensed">
        <thead>
            <tr>
                <td style="width: 85px">Label</td>
                <td>Current Value</td>
                <td style="width: 250px">New Value</td>
            </tr>
        </thead>
        <tbody>
            {{#each schemaLabels}}
            <tr>
                <td>{{this.label}}</td>
                <td>{{this.value}}</td>
        </tr>
        {{/each}}
    </tbody>
</table>
</template>

事件:

一开始,会话变量的值是未定义的。当我不断更改下拉列表中的选定元素时,会话变量值不断变化,这很好。

Template.defaultTemplate.events({
  "change #schemaNameId": function(event, template){
    var selectValue = template.$("#schemaNameId").val();
    // console.log(selectValue +" is selected from dropdown - message logged in events");
    Session.set("selectedSchema",selectValue);
    console.log(Session.get("selectedSchema")+ " is session variable set - message logged in events");
  }
});

助手:

随着我不断更改下拉菜单,下面的控制台日志也不断变化,这又是一个好兆头,因为我的会话变量可以在帮助程序中访问。

Template.defaultTemplate.schemaNames({
   schemaNames: function () {
               console.log(Session.get("selectedSchema")+ " is session variable - message logged in defaultTemplate:schemaNames");
       return Defaults.find({},{schemaName:1}).map(function(c) {return {schemaName : c.schemaName};
       });
   },

但是,对于下面的这个函数,控制台日志根本不打印任何东西!这意味着控制永远不会到达这一点,即使所有这些都在同一个帮助器类中。

schemaLabels: function() {
       var selectedSchema = Session.get("schemaName");
       console.log(Session.get("schemaName") +"is the selectedSchema - message logged in defaultTemplate:schemaLabels");
       return Defaults.find({schemaName:selectedSchema},{_id:0,schemaName:0}).map(function(c) {return {label : c.label, value: c.value};});

   }
});

更新:

经过进一步修改,我注意到会话变量在一开始只在 schemaLabels 辅助函数中调用一次。它设置为未定义。之后,再也不会调用这个。因此,无论我选择什么下拉列表,表格都不会填充任何内容。

【问题讨论】:

    标签: javascript session meteor dom-events meteor-helper


    【解决方案1】:

    我不明白您为什么认为应该调用 schemaLabels 助手。 您正在使用两个不同的 Session 变量(selectedSchemaschemaName),因此这些助手是分开的。

    因此,如果您希望每次更改 selectedSchema(Session)、schemaLabels 调用助手时都这样,则必须像这样修改 schemaLabels:

    schemaLabels: function() {
           var foo = Session.get("selectedSchema"); 
           var selectedSchema = Session.get("schemaName");
           console.log(Session.get("schemaName") +"is the selectedSchema - message logged in defaultTemplate:schemaLabels");
           return Defaults.find({schemaName:selectedSchema},{_id:0,schemaName:0}).map(function(c) {return {label : c.label, value: c.value};});
    
       }
    

    【讨论】:

    • 天哪!我从来没有意识到我实际上在某个时间点更改了 schemaLabels 中的变量名并且没有恢复!非常感谢!我现在可以工作了。
    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多