Получение данных закрытого массива в шаблоне Handlebars.js

Учитывая эту простую конструкцию JavaScript:

var MyObject = function() {
  var privateArray = [
    { name: 'one' },
    { name: 'two' }
  ];
  this.returnPrivate = function(index) {
    return privateArray[index];  
  };
};
var obj = new MyObject();

В шаблоне руля я хотел бы иметь возможность печатать свойство name объекта по определенному индексу privateArray с помощью функции returnPrivate.

// This of course does not work.
<p>{{returnPrivate(1).name}}</p>

Я только начинаю работать с handlebars.js, поэтому уже может быть стандартный способ сделать это. Или это может быть попытка встроить в шаблон слишком много логики и идти против того, что такое руль.


person Noah Freitas    schedule 14.06.2012    source источник


Ответы (2)


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

/**
 * Given the name of a function that returns an array value, this helper
 * returns the value at a given index.  Optionally it takes a property name
 * in case the array value at the given index is itself an object.
 */
Handlebars.registerHelper('eqf', function(func, index, prop) {
  if (typeof prop === 'string') {
    return func(index)[prop];
  } else {
    return func(index);
  }
});

Пример использования для вопроса:

<p>{{eqf returnPrivate 1 "name"}}</p>
person Noah Freitas    schedule 14.06.2012

Handlebars имеет специальный синтаксис для работы с числовыми или символьными идентификаторами, как описано здесь. Если вы можете передать индекс массива как литерал, вы можете использовать следующее:

{{privateArray.[1].name}}

Это работает, только если вы реструктурируете объект, чтобы сделать privateArray доступным для шаблона. Если вы действительно хотите скрыть privateArray и заставить шаблон использовать вызов функции, вы должны использовать помощник.

person mcw    schedule 25.09.2013