从外部事件回调中访问数据

时间:2015-07-23 14:16:59

标签: meteor

<template name="SideNav">
  <ul class='block-items white'>
    {{#each blocks}}
      <li class='block-item'>
        <i class="fa fa-fw fa-folder"></i>
        <i class="fa fa-fw fa-folder-open"></i>
        <a href='#' class='block-item-link'>
          {{name}}
     ...
     {{/each blocks}}
</template>

鉴于此,我可以通过点击

来访问每个块项id
Template.SideNav.events({
  "click .block-item": function (e, tem) {
    //var blockItemId = this._id;
  }
});

如何从其他地方借用相同的功能,例如onRendered()?看一下下面的例子:

  Template.SideNav.onRendered(function() {
    this.$('.block-items').sortable({
      update: function (e, ui) {
        _.each($('.block-item'), function (blockItem) {
          // How do I get blockId?
        })
        console.log("block item rearranged");
      }
    });

update是一个回调函数,当ul列表中的块项顺序发生变化时,会调用该函数。我需要一种方法来遍历所有块项并获得相应的Mongo id。我该怎么办?

相关文件:

  1. The context of "this" in Meteor template event handlers (using Handlebars for templating)

1 个答案:

答案 0 :(得分:1)

更新:“流星之路”

如果您正在寻找Blaze如何获取事件和帮助程序的数据上下文,那么事实证明有一个神奇的Blaze.getData()函数,它将Blaze视图作为DOM对象并返回它的数据背景。据我所知,通过查看代码,它似乎是Blaze用于向助手和事件提供数据上下文的工具。

所以在你的情况下,你可以使用:

  Template.SideNav.onRendered(function() {
    this.$('.block-items').sortable({
      update: function (e, ui) {
        _.each($('.block-item'), function (blockItem) {
          var context = Blaze.getData(blockItem.get(0));
          var blockId = context._id;
        })
        console.log("block item rearranged");
      }
    });

原始答案

使用DOM操作(除了blaze事件)获取文档id的简单方法是将其显式设置为模板中的属性,例如:

<template name="SideNav">
  <ul class='block-items white'>
    {{#each blocks}}
      <li class='block-item' id='{{_id}}'>
        <i class="fa fa-fw fa-folder"></i>
        <i class="fa fa-fw fa-folder-open"></i>
        <a href='#' class='block-item-link'>
          {{name}}
     ...
     {{/each blocks}}
</template>

这样,你可以使用jquery的attr方法获取id:

  Template.SideNav.onRendered(function() {
    this.$('.block-items').sortable({
      update: function (e, ui) {
        _.each($('.block-item'), function (blockItem) {
          var blockId = blockItem.attr('id');
        })
        console.log("block item rearranged");
      }
    });