Meteor JS:存储特定模板实例状态的最佳方法是什么?

2024-05-24

我正在学习 Meteor JS 中的会话和反应式数据源。它们非常适合设置全局 UI 状态。但是,我不知道如何将它们的范围限制到模板的特定实例。

这就是我想做的

我的页面上有多个可内容编辑的元素。每个下面都有一个“编辑”按钮。当用户单击“编辑”按钮时,它应该聚焦在该元素上,并显示“保存”和“取消”按钮。

如果用户单击“取消”,则所有更改都会被消除,并且模板实例应使用原始内容重新呈现。

这是我到目前为止的代码

// Helper
Template.form.helpers({
  editState: function() {
    return Session.get("editState");
  }
});

// Rendered
Template.form.rendered = function(e){
  var $this = $(this.firstNode);
  var formField = this.find('.form-field');
  if (Session.get("editState")) formField.focus();
};

// Event map
Template.form.events({
  'click .edit-btn' : function (e, template) {
    e.preventDefault();
    Session.set("editState", "is-editing");
  },

  'click .cancel-btn' : function (e, template) {
    e.preventDefault();
    Session.set("editState", null);
  },
});

// Template
<template name="form">
  <div class="{{editState}}">
    <p class="form-field" contenteditable>
      {{descriptionText}}
    </p>
  </div>
  <a href="#" class="edit-btn">Edit</a>
  <a href="#" class="save-btn">Save</a>
  <a href="#" class="cancel-btn">Cancel</a>
</template>


// CSS
.edit-btn
.cancel-btn,
.save-btn {
  display: inline-block;
}

.cancel-btn,
.save-btn {
  display: none;
}

.is-editing .cancel-btn,
.is-editing .save-btn  {
  display: inline-block;
}

问题

如果我有多个实例Form模板,那么.form-field专注于每一项,而不仅仅是正在编辑的一项。如何使只有正在编辑的内容获得焦点?


您可以使用以下方式渲染模板data,它基本上只是插入到页面时传递给它的对象。

数据可能只是在应用程序中使用的关键Session for editState.

例如,渲染模板Template.form({editStateKey:'editState-topForm'})

你可以制作一个车把助手,例如,

Handlebars.registerHelper('formWithOptions', 
  function(editStateKey){
    return Template.form({editStateKey:editStateKey})
});

然后将其插入到您的模板中

{{{formWithOptions 'editState-topForm'}}}(注意三重{, })

接下来,更改引用Session.x('editState') to Session.x(this.editStateKey)/ Session.x(this.data.editStateKey)

Template.form.helpers({
  editState: function() {
    return Session.get(this.editStateKey);
  }
});

// Rendered
Template.form.rendered = function(e){
  var $this = $(this.firstNode);
  var formField = this.find('.form-field');
  if (Session.get(this.data.editStateKey)) formField.focus();
};

// Event map
Template.form.events({
  'click .edit-btn' : function (e, template) {
    e.preventDefault();
    Session.set(this.editStateKey, "is-editing");
  },

  'click .cancel-btn' : function (e, template) {
    e.preventDefault();
    Session.set(this.editStateKey, null);
  },
});

注意:如果您正在使用iron-router它有额外的 api 用于传递data到模板。

注2:在meteor 1.0中应该有更好的支持编写您自己的小部件。这应该可以更好地控制此类事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Meteor JS:存储特定模板实例状态的最佳方法是什么? 的相关文章

随机推荐

  • 请求挂在 IIS 7.5 上的会话模块上

    有时 我网站上的一些请求开始挂在 Session 模块的 RequestAcquireState 状态上 当螺旋开始时 所有请求都会超时 我们需要在受影响的服务器上重新启动 IIS 我进行了很多调查 得到的唯一结论是 当应用程序尝试访问存储
  • java 1.8下无法启动eclipse

    java 1 8 升级后我无法启动 eclipse 附上错误截图 这是我的 eclipse 配置设置 我该如何解决 startup plugins org eclipse equinox launcher 1 3 0 v20120522 1
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • PHP:如何使用 nl2br() 和 HTML Purifier 保持换行?

    Issue 使用时HTML 净化器 http htmlpurifier org 为了处理用户输入的内容 换行符不会被转换为 br tags 考虑以下用户输入的内容 Lorem ipsum dolor sit amet This is ano
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • 在组合框更改上设置文本字段的值-easyui

    下面是我的行的一部分 当组合框值更改时 我需要更改 BudgetLineItemCode 字段的值 title Index field RootLevel width 50 editor type validatebox options r
  • PostgreSQL 索引创建时间

    我可以使用什么查询来找出数据库中创建特定索引 唯一或非唯一 的时间 日期 基本上我想找出过去一个月左右创建的索引 这不可能 没有关于创建关系 索引等的时间的信息
  • 处理照片上传的最佳方式是什么?

    我正在为一个家庭成员的婚礼制作一个网站 他们要求的一个功能是一个照片部分 所有客人都可以在婚礼结束后前往并上传他们的照片 我说这是一个很棒的想法 然后我就去实现它 那么只有一个问题 物流 上传速度很慢 现代相机拍摄的照片很大 2 5 兆 我
  • 在 Asp.net 开发中水晶报表查看器工具栏图像不显示

    我们在我的一个项目中使用 Crystal Report 11 5 与 2008 来显示报表 当我尝试在 Crystal Report Viewer 中显示报表时 报表显示正确 但工具栏图标 第一个 上一个 下一个 打印等 图像未显示 单击这
  • 在 JPA 中保留 Java 8 LocalTime

    我的一个实体中有一个 Java 8 LocalTime private final LocalTime departureTime 它是一个带有 Spring Data Rest 的 Spring Boot 1 3 6 应用程序 我使用 J
  • MySQL 查询按父级排序然后子级排序

    我的数据库中有一个页面表 每个页面可以有一个父页面 如下所示 id parent id title 1 0 Home 2 0 Sitemap 3 0 Products 4 3 Product 1 5 3 Product 2 6 4 Prod
  • ipa 应用程序无法添加到我们的 itunes 库,它不是有效的应用程序

    我使用 xcode 6 和 swift 语言制作了一个未签名的 IPA 应用程序 我已压缩 app 文件并将其扩展名更改为 ipa 当我想在越狱的iPhone上安装这个 ipa文件时 出现以下错误 无法将应用程序 youtapp ipa 添
  • web.xml 中的多个安全约束不起作用

    我正在升级一个 Web 应用程序 Servlet 3 0 Tomcat 7 它的大部分页面都需要基本身份验证 该应用程序具有一小组监视 servlet 其中任何一个都不应该受到保护 在我的web xml 我目前有以下内容security c
  • 调整传单地图大小时如何保持地图居中?

    我在用着leaftlet http leafletjs com reference html在网页上创建地图 地图的左侧是一个滑出的面板 当面板滑出时 地图会调整大小以填充页面上的剩余空间 当面板向左滑出时 地图调整大小 中心点向左移动 理
  • R 彩色树状图建议?

    我想制作彩色树状图 但尚未找到足够的库 http addictedtor free fr graphiques RGraphGallery php graph 79 http addictedtor free fr graphiques R
  • 我为什么要学习 Lisp? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我可以关闭并重新打开套接字吗?

    我学习了一个使用套接字的例子 在此示例中 客户端向服务器发送请求以打开套接字 然后服务器 侦听特定端口 打开套接字 一切都很好 套接字从双方 客户端和服务器 打开 但我仍然不清楚这个东西有多灵活 例如 客户端是否可以关闭一个打开的 从两端
  • 在 PHP 上发送不带 SMTP 标头的 SMS

    我正在尝试使用以下对我有用的代码通过 PHP 发送短信验证码 但我越来越 email protected cdn cgi l email protecti
  • 使用MVVM时如何将事件参数作为interaction.Trigger中的参数传递?

    基本上我的自定义类中有一个事件 我将使用事件的参数 gt 属性作为该方法的参数来调用自定义类中的特定方法 您可以观察此信息背后的实际代码 instance FileOpening sender e gt CustomClass Method
  • Meteor JS:存储特定模板实例状态的最佳方法是什么?

    我正在学习 Meteor JS 中的会话和反应式数据源 它们非常适合设置全局 UI 状态 但是 我不知道如何将它们的范围限制到模板的特定实例 这就是我想做的 我的页面上有多个可内容编辑的元素 每个下面都有一个 编辑 按钮 当用户单击 编辑