Disons que j'ai un objet, someObject:
{
foo: "Apple",
myArray: ["abc", "def"]
}
Et un assistant modèle qui ressemble à ceci (et fonctionne bien):
getArray: function(){
var self = this;
self.myArray = self.myArray || [];
return self.myArray;
}
Comment dois-je construire le HTML pour obtenir l'index de tableau?
J'ai essayé:
<template name="someObject"> // takes someObject as data
{{#each getArray}}
<div class="item" data-value="{{WHAT GOES HERE?}}">{{this}}</div>
{{/each}}
</template>
Dans ce cas, this
renvoie avec succès "abc"
et "def"
. Ce qui est bon. Mais comment puis-je obtenir l'index du tableau à mettre dans l'attribut data-value
?
J'ai essayé this.index
directement mais ce n'est pas défini. J'ai aussi essayé d'utiliser un assistant:
<template name="someObject"> // takes someObject as data
{{#each getArray}}
<div class="item" data-value="{{getindex}}">{{this}}</div>
{{/each}}
</template>
mais dans cet assistant getIndex
quand je console.log out this
je vois:
String {0: "a", 1: "b", 2: "c", length: 3}
String {0: "d", 1: "e", 2: "f", length: 3}
Est-il possible d'obtenir l'index?
Les barres d'espace ont acquis de nombreuses fonctionnalités dans la version 1.2, y compris un @index
natif. Les assistants ne sont plus nécessaires pour résoudre ce problème - vous pouvez simplement faire ceci:
{{#each getArray}}
<div class="item" data-value="{{@index}}">{{this}}</div>
{{/each}}
ou, si vous voulez utiliser l'index à l'intérieur d'une aide:
{{#each getArray}}
<div class="item" data-value="{{someHelper @index}}">{{this}}</div>
{{/each}}
Dans le futur, les barres d'espace peuvent offrir la possibilité de déterminer l'index directement dans le modèle. Cependant, à la date de cette écriture, le seul moyen d’obtenir l’index est de modifier le résultat renvoyé par l’assistant. Par exemple, vous pouvez avoir getArray
renvoyer un tableau d'objets contenant une value
et une index
, comme ceci:
getArray: function() {
var self = this;
self.myArray = self.myArray || [];
return _.map(self.myArray, function(value, index){
return {value: value, index: index};
});
}
Et le modèle pourrait utiliser l'index comme ceci:
<template name="someObject">
{{#each getArray}}
<div class="item" data-value="{{index}}">{{value}}</div>
{{/each}}
</template>
Voir aussi cette réponse pour un exemple similaire avec les curseurs.
Il est à noter que vous n'avez probablement pas besoin de stocker l'index dans le DOM lui-même via data-value
, à moins que cela ne soit nécessaire par un plugin externe. Comme vous pouvez le voir dans l'exemple ci-dessous, chaque item
a un contexte avec une valeur d'index. Pour plus d'informations, voir cet article de blog .
Template.someObject.events({
'click .item': function() {
console.log(this.index);
}
});
Vous pouvez également en faire une aide réutilisable. C'est pratique d'avoir:
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}}
Ce changement est à venir .__ et vous pourrez faire {{@index}}
. Lorsque météore prend en charge la version la plus récente du guidon.
Vous pouvez modifier getArray pour renvoyer un tableau de nuplets et y stocker l'index.
Vous pouvez aussi le faire avec un trait de soulignement, en supposant que vous ayez souscrit votre modèle à un tableau d'objets
Template.yourTemplate.helpers({
objectsWithIndex: function() {
_.map(this.objects, function(value, key) {
return _.extend(value, {
index: key
});
});
return this.objects;
}
});
et dans votre html ...
<template name="someObject">
{{#each objectsWithIndex}}
<div class="item" data-value="{{index}}">{{value}}</div>
{{/each}}
</template>
Voici un exemple de la façon dont vous pouvez simplement ajouter un index à l’objet et tant que vous n’avez pas de clé nommée index avant qu’elle ne gêne quoi que ce soit de cette façon, elle ne fonctionne que pour les tableaux d’objets. Maintenant, si vous avez un tableau de valeurs, vous devriez utiliser la réponse de 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}}