Je ne pouvais pas trouver un moyen d'utiliser une aide intégrée pour joindre une liste d'éléments avec un délimiteur. S'il existe déjà un assistant intégré ou une combinaison d'assistants intégrés qui peuvent le faire, veuillez m'en informer. Sinon, je vous suggère d'ajouter une aide intégrée appelée "join" qui a un paramètre pour le délimiteur.
Par exemple, le modèle contiendrait quelque chose comme ceci :
{{join myArray delimiter=", "}}
J'ai fini par enregistrer mon propre assistant pour mes besoins immédiats :
Handlebars.registerHelper("join", function(context, block) {
return context.join(block.hash.delimiter);
});
Cela devrait être modifié pour gérer les cas où le contexte est nul, le contexte n'est pas un tableau, le délimiteur est nul, etc.
Je viens de faire ça pour moi aujourd'hui :
Handlebars.registerHelper('join', function(val, delimiter, start, end) {
return [].concat(val).slice(start, end).join(delimiter);
});
Si val n'est pas un tableau, cela a pour effet de simplement renvoyer val. Les 2e à 4e paramètres sont entièrement facultatifs (le délimiteur par défaut est ","). Je n'ai testé que sur Chrome jusqu'à présent.
Mise à jour : cela casse dans IE8. [...].slice(undefined, undefined)
renvoie un tableau vide plutôt que le tableau entier comme dans les autres navigateurs. De plus, si vous ne fournissez pas de délimiteur dans la définition de votre modèle, Handlebars transmet l'objet de hachage comme délimiteur, qu'IE rend sous la forme "[Objet]" plutôt qu'une virgule comme les autres navigateurs. Ma version révisée ressemble à ceci :
Handlebars.registerHelper('join', function(val, delimiter, start, end) {
var arry = [].concat(val);
delimiter = ( typeof delimiter == "string" ? delimiter : ',' );
start = start || 0;
end = ( end === undefined ? arry.length : end );
return arry.slice(start, end).join(delimiter);
});
Pas aussi élégant, mais la vérification de la santé mentale de vos entrées est probablement une bonne pratique.
--Tchad
J'ai intégré les suggestions de Ceberle :
//Handlebars "join" block helper that supports arrays of objects or strings.
//If "delimiter" is not speficified, then it defaults to ",". You can use "start",
//and "end" to do a "slice" of the array.
Handlebars.registerHelper('join', function(items, block) {
var delimiter = block.hash.delimiter || ",",
start = start = block.hash.start || 0,
len = items ? items.length : 0,
end = block.hash.end || len,
out = "";
if(end > len) end = len;
if ('function' === typeof block) {
for (i = start; i < end; i++) {
if (i > start) out += delimiter;
out += block(items[i]);
if('string' === typeof items[i])
out += items[i];
else
out += block(items[i]);
}
return out;
} else {
return [].concat(items).slice(start, end).join(delimiter);
}
});
Oups, je voulais supprimer une ligne :
//Handlebars "join" block helper that supports arrays of objects or strings.
//If "delimiter" is not speficified, then it defaults to ",". You can use "start",
//and "end" to do a "slice" of the array.
Handlebars.registerHelper('join', function(items, block) {
var delimiter = block.hash.delimiter || ",",
start = start = block.hash.start || 0,
len = items ? items.length : 0,
end = block.hash.end || len,
out = "";
if(end > len) end = len;
if ('function' === typeof block) {
for (i = start; i < end; i++) {
if (i > start)
out += delimiter;
if('string' === typeof items[i])
out += items[i];
else
out += block(items[i]);
}
return out;
} else {
return [].concat(items).slice(start, end).join(delimiter);
}
});
@jlubean : quelle version de guidon utilisez-vous ? Je ne parviens pas à le faire fonctionner jusqu'à la version bêta 4. J'obtiens l'erreur suivante lors de l'utilisation d'une syntaxe telle que :
{{join list_of_words delimiter=","}}
L'erreur:
Uncaught Error: Parse error on line 35:
..._of_words delimiter=","}}</tex
-----------------------^
Expecting 'STRING', 'INTEGER', 'BOOLEAN', 'ID'
J'utilisais la version bêta 3. Jetez un œil à mon exemple de travail sur http://jsfiddle.net/jlubean/YS3EV/
J'ai écrit ceci : http://mametipsum.herokuapp.com/. Je préférerais ne pas obliger les gens à spécifier un assistant comme celui-ci (voir l'onglet "Modèle"). J'aimerais rester simple. J'aimerais que les espaces soient la valeur par défaut lors de l'impression d'un tableau. Je suis heureux de remplacer l'assistant de tableau par défaut, mais comment puis-je faire cela ? Merci.
Personnellement, je pense que Handlebars est mieux gardé simple. Si quelqu'un souhaite créer un repo/gist avec des aides utiles, nous pourrions probablement créer un lien vers celui-ci ou le mettre en évidence.
Pour le nœud :
Handlebars.registerHelper( "join", function( array, sep, options ) {
return array.map(function( item ) {
return options.fn( item );
}).join( sep );
});
<p>
{{#join companies "<br>"}}
{{name}}
{{/join}}
</p>
Commentaire le plus utile
Pour le nœud :