Handlebars.js: 機能リクエスト:組み込みの「参加」ヘルパー

作成日 2011年10月27日  ·  8コメント  ·  ソース: handlebars-lang/handlebars.js

組み込みのヘルパーを使用して、区切り文字でアイテムのリストを結合する方法がわかりませんでした。 これを実行できる組み込みヘルパーまたは組み込みヘルパーの組み合わせがすでに存在する場合は、お知らせください。 それ以外の場合は、区切り文字のパラメーターを持つ「join」という組み込みのヘルパーを追加することをお勧めします。

たとえば、テンプレートには次のようなものが含まれます。

 {{join myArray delimiter=", "}}

私は自分の当面のニーズに合わせて自分のヘルパーを登録することになりました。

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

これは、コンテキストがnullの場合、コンテキストが配列ではない場合、区切り文字がnullの場合などを処理するように変更する必要があります。

feature

最も参考になるコメント

ノードの場合:

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>

全てのコメント8件

私は今日自分のためにこれをしました:

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

valが配列でない場合は、valを返すだけの効果があります。 2番目から4番目のパラメーターは完全にオプションです(デフォルトの区切り文字は "、"です)。 これまでのところ、Chromeでのみテストしました。

更新:これはIE8で壊れます。 [...].slice(undefined, undefined)は、他のブラウザのように配列全体ではなく、空の配列を返します。 また、テンプレート定義で区切り文字を指定しない場合、Handlebarsはハッシュオブジェクトを区切り文字として渡します。IEは他のブラウザーのようにコンマではなく「[Object]」としてレンダリングします。 私の改訂版は次のようになります。

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

それほどエレガントではありませんが、入力の健全性チェックはおそらく良い習慣です。

-チャド

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

おっと、私は1行を取り出すつもりでした:

//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 :どのバージョンのハンドルバーを使用していますか? ベータ4までは動作させることができません。次のような構文を使用すると、次のエラーが発生します。

{{join list_of_words delimiter=","}}

エラー:

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

私はベータ3を使用していました。http://jsfiddle.net/jlubean/YS3EV/で私の作業例を見てください。

私はこれを書きました:http: //mametipsum.herokuapp.com/。 このようなヘルパーを指定する必要はありません([テンプレート]タブを参照)。 シンプルにしたいと思います。 配列を印刷するときのデフォルトをスペースにしたいのですが。 デフォルトの配列ヘルパーをオーバーライドできてうれしいですが、どうすればよいですか? ありがとう。

個人的には、ハンドルバーはシンプルに保つのが最善だと思います。 誰かがレポ/要点を有用なヘルパーと一緒にまとめたい場合は、おそらくそれにリンクするか、そうでなければそれを強調することができます。

ノードの場合:

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>
このページは役に立ちましたか?
0 / 5 - 0 評価