web-dev-qa-db-ja.com

テンプレートに記述された配列を流星/ハンドルバーヘルパーに渡します

配列内のすべてのアイテムを出力するprintArrayというヘルパーがあります。 JSで配列を定義し、コンテキストオブジェクトを介してヘルパーに渡すとうまく機能します。私がやりたいのは、次のように、テンプレート内で配列を定義することです。

{{printArray arr=[1, 3, 4] }}

残念ながら、これが私のヘルパーに届くまでに、arrキーはundefinedを指しています。 javascriptで定義せずにヘルパー内に配列を取得するための有効な構文はありますか?

22
Riley Lark

配列を返す別のヘルパーを使用する必要があります

Template.ArrayDemo.helpers({
    arrayValues: [1, 2, 3],
    printArray: function(arr) {
        for (i = 0; i < arr.length; i++) {
            console.log(arr[i]);
        }
    }
 });

今、あなたはすることができます

{{printArray arr=arrayValues}}

2
Syed Is Saqlain

JavaScriptのarguments配列を使用して、このようなことを実現できます。 arguments配列を使用すると、関数が呼び出されたときに関数に渡されるすべての値にアクセスできます。

これにより、次のような構文を使用できるようになります。

{{printArray 1 3 4}}

コードは次のようになります。

Handlebars.registerHelper('printArray', function() {
    //Last argument is the options object.
    var options = arguments[arguments.length - 1];

    //Skip the last argument.
    for(var i = 0; i < arguments.length - 1; ++i) {
        //Do your thing with each array element.
    }

    //Return your results...
    return '';
});
8
AaronSieb

eval()を使用すると、次のようなヘルパーを使用して、これをほぼ達成できます。

Handlebars.registerHelper('printArray', function(values) {
   var array = eval(values);

   if (array.constructor === Array()) {
     ...
   }
}

上記では、テンプレートからこれを呼び出すことができます。

{{printArray '[0, 1, 2]'}}

このメソッドの1つの注意点は、配列を文字列として渡す必要があることです。

3
Ian Westerfield

配列の括弧で囲まれた値だけを渡してみましたか?

{{printArray [1, 3, 4]}}

ハンドルバーヘルパーメソッドへの引数として、オブジェクトを簡単に渡すことができることを私は知っています。

{{printArray {arr: [1, 3, 4]} }}

これらの素晴らしいヘルパーメソッドを見てください。そのほとんどは他の場所から盗みましたが、そのうちのいくつかは私が書いたり微調整したりしました...これらはこのトピックに関する私の参照の出発点です。

https://github.com/zeroasterisk/Presenteract/blob/master/client/lib/handlebar-helpers.js

1
zeroasterisk

配列ヘルパーは次のように定義できます。

Handlebars.registerHelper('array', function() {
    return Array.prototype.slice.call(arguments, 0, -1);
}

{{printArray (array 1 3 4)}}
1
SmallTitan