Передать массив, написанный в шаблоне, в meteor / Handlebars helper

у меня есть помощник по имени printArray это просто печатает каждый элемент в массиве. Он отлично работает, когда я определяю массив в JS и передаю его помощнику через объект контекста. То, что я хочу сделать, это определить массив прямо в шаблоне, например:

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

к сожалению, к тому времени, когда это доходит до моего помощника,arr ключевые моменты undefined. Есть ли допустимый синтаксис, чтобы получить массив внутри моего помощника, не определяя его в javascript?

5 ответов


вам нужно использовать другой помощник, который возвращает массив

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

теперь вы можете сделать

{{printArray arr=arrayValues}}


вы можете использовать JavaScript arguments массив для выполнения чего-то подобного. The arguments array дает вам доступ к каждому значению, переданному функции при ее вызове.

Это позволит вам использовать синтаксис такой:

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

вы можете почти сделать это с помощью eval(), используя такой помощник:

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

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

выше позволяет вызвать это из шаблона:

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

одно предостережение к этому методу заключается в том, что вы должны передать свой массив в виде строки.


вы пробовали передать только заключенное в квадратные скобки значение массива?

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

Я знаю, что вы можете легко передать объекты в качестве аргументов вспомогательным методам handlebars:

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

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


вы можете определить помощник массива, как показано ниже.

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

{{printArray (array 1 3 4)}}