javascript - 模板事件无法返回上下文数据

标签 javascript jquery meteor

此 Meteor 模板单击事件预计会将属性 shortName 打印到浏览器控制台,但它打印 undefined。为什么以及如何解决它?谢谢

"use strict";

Template.subMenu.helpers({
  subMenuItems: () => {
    let task = Session.get('taskSelected');
      return SubMenuCol.find({action: task});
  }
});

Template.subMenu.events({
  'click .subMenuItem': (event) => {
    //let shortName = $(event.target).data('shortName');
    let shortName = event.currentTarget.dataset.shortName;

    console.log(shortName);
  }
});
<template name="subMenu">
  <ul id="sub-menu">
    {{#if Template.subscriptionsReady}}
      {{#each subMenuItems}}
        <li class="subMenuItem" data-shorName={{shortName}} data-action={{action}}>{{menuItem}}</li>
      {{/each}}
    {{/if}}
  </ul>
</template>

编辑
shortName 是一个拼写错误,已修复但无济于事。仍然给出未定义

最佳答案

首先,我将使用数据上下文而不是使用 data-* 属性。呈现某个元素的数据上下文由 Blaze 保留,并且可作为其 this 上下文提供给事件处理程序,因此只需在事件处理程序中使用 this.shortName 即可已经给了你想要的值。

<template name="subMenu">
  <ul class="sub-menu">
    {{#if Template.subscriptionsReady}}
      {{#each subMenuItems}}
        <li class="sub-menu-item">{{menuItem}}</li>
      {{/each}}
    {{/if}}
  </ul>
</template>

您将把它作为数据上下文,只是不要使用箭头函数,该函数将其 this 上下文静态绑定(bind)到其定义期间使用的上下文。

Template.subMenu.events({
  'click .sub-menu-item'(event) {
    let shortName = this.shortName;
    console.log(shortName);
  }
});
<小时/>

如果您选择自定义数据属性,您应该了解它们的规范以及到 JS 的映射。这不是 1:1,也不是一切都被允许。

  • The name of a custom data attribute in HTML begins with data-. It must contain only letters, numbers and the following characters: dash (-), dot (.), colon (:), underscore (_) -- but NOT any ASCII capital letters (A to Z).
  • The name of a custom data attribute in Javascript is the name of the same HTML attribute but in camelCase and with no dashes, dots, etc.

source: MDN

这意味着您使用的标识符不合法,shortName对应的应该是data-short-name:

<li class="subMenuItem" data-short-name={{shortName}} data-action={{action}}>{{menuItem}}</li>

关于javascript - 模板事件无法返回上下文数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42523940/

相关文章:

collections - 为什么要使用 Collection.allow 而不是 Meteor.methods 和 Meteor.call 这些方法?

javascript - 正确的 JavaScript 对象

javascript - meteor MDG :validated-method without using simple schema

javascript - 如何使用 Javascript SDK 设置访问 token ?

jquery - 使用 jQuery 更改/替换表列值

javascript - 从 Web 应用程序中的任何网页捕获扫描的条形码

jquery - 网站无法在 iphone/ipad 上运行。调整大小问题

ubuntu - 部署后如何强制 PM2 更新我的 meteor 应用程序服务器端?

javascript - 如何将 "find and insert"写入变量?

javascript - 如何在我的 Web 应用程序中使用单一模式并避免在每个页面上重复 html?