使 Meteor 对 html 元素具有反应性
Making Meteor reactive for html elements
所以我有一个模态框,允许用户编辑/保存一些数据。
我只想补充一点,与其他 Meteor 应用程序不同,我不想立即保存数据 - 我希望用户在点击保存之前填写所有字段,它将保存到数据库并发送到服务器等。这主要是因为我希望用户能够点击"取消"按钮来还原所有更改。
我在表单的开头有一个下拉框,根据值,将显示或隐藏字段
<select class="form-control" id="ddlNewInputType" placeholder="Enter your input type">
<option value="input">Input</option>
<option value="formula">Formula</option>
</select>
我在这样的场地周围有一个车把,以确定我是否要展示它
{{#if isFormula }}
<div class="row">
<input type="text"
id="txtNewInputFormula" placeholder="Enter formula">
</div>
{{/if}}
帮手看起来像这样
isFormula: ->
$('#ddlNewInputType').val() == 'formula'
但是,这不起作用。除了它第一次加载到页面上的时间,它永远不会点击isFormula,可能是因为Meteor不认为任何HTML元素都是反应性的,所以当HTML元素更改时它永远不会重新计算。
解决这个问题的合适方法是什么?是否可以在流星中显式地做出反应?我还在考虑将下拉列表值放入会话变量中,但这似乎很混乱,因为我需要管理此会话变量(请记住在模态框关闭等时清除它)
您的分析是正确的 - 需要涉及一个反应变量,以便您的助手在更改 select 元素后重新评估。基本策略如下所示:
- 在创建模板时初始化反应变量。
- 每当选择发生变化时,更新反应变量。
- 读取帮助程序中的反应变量。
与其使用会话变量,不如使用范围限定为模板的 ReactiveVar。下面是一组修改示例:
Template.myTemplate.helpers({
isFormula: function() {
return Template.instance().isFormula.get();
}
});
Template.myTemplate.events({
'change #ddlNewInputType': function (e, template) {
var isFormula = $(e.currentTarget).val() === 'formula';
template.isFormula.set(isFormula);
}
});
Template.myTemplate.created = function() {
// in your code, default this to the current value from
// your database rather than false
this.isFormula = new ReactiveVar(false);
};
请记住,您还需要执行以下操作:
$ meteor add reactive-var
请参阅我关于范围反应性的帖子,以获取此技术的完整解释。
相关文章:
- 当知道同一hiearch中至少有一个元素时,遍历到元素.结构使用jquery
- 如何通过铬扩展注入反应元素
- 如果有许多元素使用相同的类,我如何使用JavaScript获取特定的元素
- 如果循环中至少有一个元素返回 false,如何将变量设置为 false
- 如何使用.find()判断某个元素是否有子元素
- 检查是否有任何元素具有焦点
- 具有固定元素并填充有其他元素的页面
- 有阶级元素的孩子
- 反应元素和胖箭头函数
- 是否有反应/通量样板项目或生成器
- D3.js:enter(),update,exit(),中间有组元素
- 如果没有列表元素有子元素,则删除父元素
- 我有一系列元素.想要以第一个值作为键分成组
- 了解 SVG 中其他元素上是否有一些元素
- 我如何获得一个JS数组,它有一些元素也是数组,并使ALL数组元素成为顶级元素
- 如何检测元素外部的点击,但该元素有子元素
- 当反应元素插入DOM-Meteor时,突出显示它们
- 基础只对一定宽度有反应
- Javascript显示根XML文件中有多少元素
- 当标签中有form元素时,使用Query更改标签