如何将下拉值传递给模板助手。 [流星+火焰]

Posted

技术标签:

【中文标题】如何将下拉值传递给模板助手。 [流星+火焰]【英文标题】:How to pass Drop Down value to a Template Helper. [Meteor + Blaze] 【发布时间】:2016-11-17 10:21:36 【问题描述】:

我正在尝试创建一个模板,以便在开头有一个通过 mongo 填充的下拉列表。我有第二个模板,它显示一个表格,其中包含基于上述选择的更多详细信息。为了显示表格中的内容,我必须首先能够检索从下拉列表中选择的值。我该怎么做?

我尝试使用this.schemaNamedefaultTemplate.schemaName 检索它,但没有帮助。

模板:

<template name ='defaultTemplate'>

    <div class="form-group" data-required="true">
        <label for="Schema" class="control-label">Select the Schema</label>
        <select required="true"  class="form-control">
            <!-- <option default>Select Schema </option> -->
             #each schemaNames
            <option >schemaName</option>
            /each
        </select>
        <span class="help-block"></span>
    </div>
    > tableTemplate
</template>

<template name="tableTemplate">

    <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>
            <td>
            #autoForm id=makeUniqueID type="update" collection=Defaults doc=this autosave=true
              > afFormGroup name="value" label=false
            /autoForm
            </td>
          </tr>
        /each
      </tbody>
    </table>
</template>

助手:

import  Template  from 'meteor/templating';
import '../templates/defaultTemplate.html';

Template.defaultTemplate.helpers(
   schemaNames: function () 
       return Defaults.find(,schemaName:1).map(function(c) return schemaName : c.schemaName;
       );
   ,
   schemaLabels: function() 
       var selectedSchema = defaultTemplate.schemaName;
      // alert (selectedSchema); >>>>>>>>>> Displays Undefined <<<<<<<<<<<
       return Defaults.find(schemaNeme:selectedSchema,schemaName:0,_id:0).map(function(c) return label : c.label, value: c.value;
       );
   
 );

【问题讨论】:

【参考方案1】:

看我的回答here

基本上,您可以在模板中创建一个响应式 var 来存储下拉菜单的“状态”,在这种情况下,状态就是被选中的值。然后你有一个事件处理程序,它随着值的变化更新状态(我会在下拉列表中同时使用clickchange,也许还有其他一些)。最后,您有一个帮助器,可以根据状态返回一些信息。

您从助手返回的信息因您使用它的目的而异。在某些情况下,您会希望返回一个真/假类型的响应,例如“应该禁用此组件”,但在其他情况下,例如您的情况,我认为您希望返回下拉列表的值并将该值实际传递给您的表模板。然后,您的表格模板应根据传入的值决定要显示的内容。例如,如果我传入nullundefined,那么我的表格可能会显示一个“已禁用”表格,上面有一个“未进行选择”的覆盖,但如果我传入一个值,则在订阅以获取数据以填充表。这样,无论传入什么值,表格应该总是能够显示一些东西。

【讨论】:

谢谢@CodeChimp。在考虑了很久之后,我确实最终做了类似于您在链接中提供的答案的事情。我没有设置真/假值,而是使用 Session.set 设置了一个 Session 变量,然后使用 Session.get 在帮助程序中检索它。 是的,关键是读取反应值的助手。由于 Session 是反应式的,因此它的工作方式相同。只有使用 Session 的 catch-22 是会话在模板重新加载后仍然存在(离开并返回该页面,您仍将选择相同的值)。这可能是可取的,但也可能不是,具体取决于您的用例。【参考方案2】:
<template name ='defaultTemplate'>

<div class="form-group" data-required="true">
    <label for="Schema" class="control-label">Select the Schema</label>
    <select required="true"  class="form-control">
        <!-- <option default>Select Schema </option> -->
         #each schemaNames
        <option >schemaName</option>
        /each
    </select>
    <span class="help-block"></span>
</div>
//you need to pass the reactive var that contains selected schema name to tableTemplate
> tableTemplate selectedSchemaVar=getSelectedSchemaVar
</template>

<template name="tableTemplate">

<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>
        <td>
        #autoForm id=makeUniqueID type="update" collection=Defaults doc=this autosave=true
          > afFormGroup name="value" label=false
        /autoForm
        </td>
      </tr>
    /each
  </tbody>
</table>
</template>

JS

import  Template  from 'meteor/templating';
import '../templates/defaultTemplate.html';


Template.defaultTemplate.onCreated(function()
this.selectedSchema = new ReactiveVar();
)
Template.defaultTemplate.events(
"change .form-control":function(evt,temp)
t.selectedSchema.set(evt.target.value)

)
Template.defaultTemplate.helpers(
schemaNames: function () 
   return Defaults.find(,schemaName:1).map(function(c) return schemaName : c.schemaName;
   );
 ,
getSelectedSchemaVar:function()
return Template.instance().selectedSchema

)
Template.tableTemplate.helpers(
 schemaLabels: function() 
 var selectedSchema = `Template.instance().data.selectedSchemaVar.get();`
return Defaults.find(schemaNeme:selectedSchema,schemaName:0,_id:0).fetch().map(function(c) return label : c.label, value: c.value;
);



);

【讨论】:

以上是关于如何将下拉值传递给模板助手。 [流星+火焰]的主要内容,如果未能解决你的问题,请参考以下文章

将下拉菜单中的值传递给 Flask 模板

如何使用 Meteor 模板助手编辑 Iron-Router 中作为参数传递的值?

下拉值不使用 ajax 传递给控制器

django - 如何将多个值传递给模板标签

如何将数据值从视图传递到 Django 中的模板?

将下拉值的选定选项的值传递给 django 数据库