Handlebars.js: Demande de fonctionnalité : assistant de "joindre" intégré

Créé le 27 oct. 2011  ·  8Commentaires  ·  Source: handlebars-lang/handlebars.js

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.

feature

Commentaire le plus utile

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>

Tous les 8 commentaires

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=&quot;,&quot;}}</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>
Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

DylanPiercey picture DylanPiercey  ·  7Commentaires

amirzandi picture amirzandi  ·  7Commentaires

sontek picture sontek  ·  3Commentaires

rhariraman picture rhariraman  ·  5Commentaires

snimavat picture snimavat  ·  5Commentaires