Handlebars.js: Feature-Anfrage: Eingebauter "Join"-Helfer

Erstellt am 27. Okt. 2011  ·  8Kommentare  ·  Quelle: handlebars-lang/handlebars.js

Ich konnte keine Möglichkeit finden, einen integrierten Helfer zu verwenden, um eine Liste von Elementen mit einem Trennzeichen zu verbinden. Wenn es bereits einen eingebauten Helfer oder eine Kombination von eingebauten Helfern gibt, die dies tun können, lassen Sie es mich bitte wissen. Andernfalls schlage ich vor, dass Sie einen integrierten Helfer namens „join“ hinzufügen, der einen Parameter für das Trennzeichen hat.

Die Vorlage würde beispielsweise Folgendes enthalten:

 {{join myArray delimiter=", "}}

Am Ende habe ich meinen eigenen Helfer für meine unmittelbaren Bedürfnisse registriert:

Handlebars.registerHelper("join", function(context, block) {
     return context.join(block.hash.delimiter);
});

Dies sollte geändert werden, um Fälle zu behandeln, in denen der Kontext null ist, der Kontext kein Array ist, das Trennzeichen null ist usw.

feature

Hilfreichster Kommentar

Für Knoten:

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>

Alle 8 Kommentare

Ich habe das heute für mich gemacht:

Handlebars.registerHelper('join', function(val, delimiter, start, end) { 
    return [].concat(val).slice(start, end).join(delimiter); 
});

Wenn val kein Array ist, hat dies den Effekt, dass nur val zurückgegeben wird. Der 2. bis 4. Parameter sind vollständig optional (Standardtrennzeichen ist ","). Ich habe bisher nur auf Chrome getestet.

Update: Dies bricht in IE8. [...].slice(undefined, undefined) gibt ein leeres Array zurück und nicht das gesamte Array wie in anderen Browsern. Wenn Sie in Ihrer Vorlagendefinition kein Trennzeichen angeben, übergibt Handlebars außerdem das Hash-Objekt als Trennzeichen, das IE als „[Objekt]“ und nicht wie andere Browser als Komma darstellt. Meine überarbeitete Version sieht so aus:

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); 
});

Nicht so knapp elegant, aber es ist wahrscheinlich eine gute Praxis, Ihre Eingaben auf Plausibilität zu überprüfen.

--Tschad

Ich habe die Vorschläge von ceberle eingearbeitet:

//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);
    }
});

Ups, ich wollte eine Zeile herausnehmen:

//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 : Welche Lenkerversion verwendest du? Ich kann es mit bis zu Beta 4 nicht zum Laufen bringen. Ich erhalte die folgende Fehlermeldung, wenn ich Syntax wie verwende:

{{join list_of_words delimiter=","}}

Der Fehler:

Uncaught Error: Parse error on line 35:
..._of_words delimiter=&quot;,&quot;}}</tex
-----------------------^
Expecting 'STRING', 'INTEGER', 'BOOLEAN', 'ID'

Ich habe Beta 3 verwendet. Sehen Sie sich mein Arbeitsbeispiel unter http://jsfiddle.net/jlubean/YS3EV/ an.

Ich habe dies geschrieben: http://mametipsum.herokuapp.com/. Ich möchte lieber nicht verlangen, dass die Leute einen Helfer wie diesen angeben müssen (siehe Registerkarte "Vorlage"). Ich möchte es einfach halten. Ich möchte, dass Leerzeichen beim Drucken eines Arrays die Standardeinstellung sind. Ich überschreibe gerne den Standard-Array-Helfer, aber wie mache ich das? Danke.

Persönlich denke ich, dass Lenker am besten einfach gehalten werden. Wenn jemand ein Repo/Gist mit nützlichen Helfern zusammenstellen möchte, könnten wir wahrscheinlich darauf verlinken oder es anderweitig hervorheben.

Für Knoten:

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>
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen