2015-04-21 2 views
2

Я пытаюсь написать пользовательский итератор в космос (я использую метеорит 1.1.3). Итератор должен быть последовательным для цикла (в основном для замены моего использования #each при необходимости, так как я полагаю, что #each не гарантированно будет последовательным на его итерации).Напишите пользовательский итератор для Spacebars

Я попытался следующие:

В Lib -

UI.registerHelper 'sequentialFor',() -> 
    ret = "" 
    for i in [[email protected]] 
    id = @[i] 
    ret = ret + Template.noop 
    ret 

noop.html -

<template name="noop"> 
    {{> UI.contentBlock this}} 
<template> 

main.html -

{{#sequentialFor ids}} 
<div id="wow-{{this}}">stuff</div> 
{{/sequentialFor}} 

идентификаторами в выше представляет собой массив строк, переданных f rom один из основных помощников шаблона.

Прямо сейчас он жалуется, что возврат из моего помощника интерфейса - это [объект Object] [object Object]. Ради здравомыслие, я знаю, что если заменить мой помощник UI с:

UI.registerHelper 'sequentialFor',() -> 
    //ret = "" 
    //for i in [[email protected]] 
    // id = @[i] 
    // ret = ret + template 
    id = @[0] 
    Template.noop 

я получаю, что DIV в моем main.html показывает с соответствующим идентификатором в составе атрибута ид по желанию. Однако я не могу заставить работать цикл for.

Я не могу просто вернуть div в main.html непосредственно из помощника, потому что у меня есть много div, которые мне нужно обернуть моим новым итератором, каждый из которых имеет очень разные атрибуты.

Я думаю, что простой вопрос заключается в том, как определить свой собственный итератор блоков (сродственный с #each) в пробелах?

Более сложный вопрос может быть, что не так с моим подходом выше?

Я рассмотрел широкий спектр ресурсов, но только нашли следующую быть очень полезным: How to pass an object from to a block helper back to the block in meteor blaze? https://github.com/meteor/meteor/wiki/Using-Blaze https://github.com/meteor/meteor/blob/devel/packages/spacebars/README.md Iterating over basic “for” loop using Handlebars.js

ПРИМЕЧАНИЕ Я использую CoffeeScript

+0

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

+0

Цикл for не работает, потому что 'this' не является массивом. – pfkurtz

+0

'{{#each}}' над массивом будет упорядочено. – user3374348

ответ

0

Оказывается для меня, что вы хотите создать <div> для каждого из массива идентификаторов (исправьте меня, если я ошибаюсь). Это, как я бы об этом, нет необходимости пользовательского итератора:

Template.registerHelper('ids', function(arrayWithIds) { 
    if (!arrayWithIds) return []; 
    // do some sorting or whatever with arrayWithIds, for example: 
    var arrayOfIds = _.map(arrayWithIds, function(obj) { 
     return obj._id; 
    }); 
    return arrayOfIds; 
}); 

Тогда в main.html:

{{#each ids someDataSetWithIds}} 
    // `someDataSetWithIds` is the helper's parameter 
    // `this` in each case is an ID 
    <div id="wow-{{this}}"></div> 
{{/each}} 

Если ваш помощник возвращает объект, вы будете использовать this._id в шаблоне, вместо , Разве я неправильно понял, чего вы пытаетесь достичь?

+0

Я ценю ответ, однако это не касается того, что я прошу. Я уже могу создать эти div (по одному на id), как и в вашем ответе. Проблема, которую я пытаюсь решить, заключается в том, что (насколько мне известно) spacebars не гарантирует, что #each всегда будет синхронным (хотя при использовании его текущей реализации он есть). Гарантированная последовательная итерация очень важна для моего приложения, поэтому я пытаюсь написать последовательный итератор, чтобы занять место стандартного итератора #each, найденного в пробелах. –

+0

Даже если моя причина для создания этого итератора кажется параноидальным, не стесняйтесь подходить к моему вопросу с точки зрения того, как он вообще создает/воссоздает итератор пространства-памяти {{#each}} –

1

мне удалось получить пользовательский итератор, используя рекурсивный метод, похожий на то, что вы могли бы использовать в Haskell или Lisp:

<body> 
    {{#countdown n=5}} 
    <p>item {{this}}</p> 
    {{/countdown}} 
</body> 

<template name="countdown"> 
    {{#if positive}} 
    {{> Template.contentBlock n}} 
    {{#countdown n=nMinusOne}} 
     {{> Template.contentBlock this}} 
    {{/countdown}} 
    {{/if}} 
</template> 
Template.countdown.helpers({ 
    positive: function() {return this.n > 0;}, 
    nMinusOne: function() {return this.n - 1;} 
}); 

См meteorpad.

Производительность, вероятно, намного хуже, чем обычная {{#each}}.

+0

Спасибо за подробный ответ. Я думаю, что это лучший вариант. Тем не менее, я не буду отмечать его как решение, пока не узнаю, что нет стандартного способа написания пользовательского итератора (как и раньше). Активировать голосование в любом случае. –

Смежные вопросы