如何在每个循环的 Meteor 模板中获取数组的索引?

Posted

技术标签:

【中文标题】如何在每个循环的 Meteor 模板中获取数组的索引?【英文标题】:How can I get the index of an array in a Meteor template each loop? 【发布时间】:2014-08-05 04:17:50 【问题描述】:

假设我有一个对象,someObject:


  foo: "apple",
  myArray: ["abc", "def"]

还有一个看起来像这样的模板助手(并且工作正常):

getArray: function()
  var self = this;
  self.myArray = self.myArray || [];    
  return self.myArray;

我应该如何构造html来获取数组索引?

我试过了:

<template name="someObject"> // takes someObject as data
  #each getArray
    <div class="item" data-value="WHAT GOES HERE?">this</div>
  /each
</template>

在这种情况下this 成功返回"abc""def"。哪个好。但是如何获取数组的索引以放入属性data-value

我已经直接尝试过this.index,但它没有定义。我也尝试过使用助手:

<template name="someObject"> // takes someObject as data
  #each getArray
    <div class="item" data-value="getindex">this</div>
  /each
</template>

但是在这个助手 getIndex 中,当我 console.log out this 我看到了:

String 0: "a", 1: "b", 2: "c", length: 3
String 0: "d", 1: "e", 2: "f", length: 3

是否可以获取索引?

【问题讨论】:

【参考方案1】:

流星>= 1.2

空格键在 1.2 中获得了很多功能,包括原生 @index。不再需要助手来解决这个问题 - 你可以简单地这样做:

#each getArray
  <div class="item" data-value="@index">this</div>
/each

或者,如果您想在帮助程序中使用索引:

#each getArray
  <div class="item" data-value="someHelper @index">this</div>
/each

流星

将来某个时候,空格键可能会提供直接在模板中确定索引的功能。但是,在撰写本文时,获取索引的唯一方法是修改助手返回的结果。例如,您可以让getArray 返回一个包含valueindex 的对象数组,如下所示:

getArray: function() 
  var self = this;
  self.myArray = self.myArray || [];
  return _.map(self.myArray, function(value, index)
    return value: value, index: index;
  );

模板可以像这样使用索引:

<template name="someObject">
  #each getArray
    <div class="item" data-value="index">value</div>
  /each
</template>

另请参阅 this answer 以获取类似的光标示例。

值得一提的是,您可能不需要通过 data-value 将索引存储在 DOM 本身中,除非外部插件需要它。正如您在下面的示例中看到的,每个item 都有一个带有索引值的上下文。如需更多信息,请参阅this blog post。

Template.someObject.events(
  'click .item': function() 
    console.log(this.index);
  
);

【讨论】:

感谢您解决这个问题。笔记。 data 属性是我无法(或希望)编辑的内容所必需的,因此我别无选择。 在 Meteor 1.2.0.2 上试过这个,@index 仍然返回 undefined。 你将如何显示@index + 1?例如。从 1 而不是 0 开始? 您需要使用助手。在上面的示例中,someHelper 可以实现为返回其参数的值 + 1。【参考方案2】:

您也可以将其设为可重复使用的助手。它很方便:

JS:

UI.registerHelper('addIndex', function (all) 
    return _.map(all, function(val, index) 
        return index: index, value: val;
    );
);

HTML:

#each addIndex somearray
<div>
   index: value
</div>
/each

【讨论】:

【参考方案3】:

这个变化是coming 你将能够做到@index。什么时候流星支持最新版本的车把。

【讨论】:

在我写这篇文章的时候它还没有发布。可能情况仍然如此:/ 这是作为 Meteor 1.2 的一部分发布的【参考方案4】:

您可以更改 getArray 以返回一个元组数组并将索引存储在那里。

【讨论】:

【参考方案5】:

这是一个示例,说明如何仅向对象添加索引,并且只要您没有名为 index 的键,它就不会阻碍任何内容,这种方式仅适用于对象数组。现在,如果您有一组值,则应该使用 Christan Fritz 答案

UI.registerHelper("withIndex", function(obj) 
  obj = obj || [];
  _.each(obj, function (object, index) 
    obj[index].index = index;
  );
  return obj;
);

#each withIndex fields
   <div class="form-group field" data-index="index">
      <label for="name">title</label> 
    </div>
/each

【讨论】:

【参考方案6】:

你也可以用下划线来做,假设你已经为你的模板订阅了对象数组

Template.yourTemplate.helpers(
  objectsWithIndex: function() 
    _.map(this.objects, function(value, key) 
      return _.extend(value, 
        index: key
      );
    );
    return this.objects;
  
);

在你的 html 中...

<template name="someObject">
  #each objectsWithIndex
    <div class="item" data-value="index">value</div>
  /each
</template>

【讨论】:

以上是关于如何在每个循环的 Meteor 模板中获取数组的索引?的主要内容,如果未能解决你的问题,请参考以下文章

从流星中的循环调用外部模板

在 Meteor 的 onCreated 中获取模板变量

Meteor 集合获取返回空数组但已订阅

Meteor JS如何从集合中的数组中获取特定对象?

如何将一个模板的一些数据发送到另一个模板 Meteor

如何使用 Meteor Spacebars 模板动态呈现 HTML?