为Spacebars编写自定义迭代器

时间:2015-04-21 22:10:07

标签: meteor coffeescript meteor-blaze spacebars

我试图在空格键中编写自定义迭代器(我使用meteor 1.1.3)。迭代器是一个顺序的for循环(基本上是在需要时替换我对#each的使用,因为我相信#each在迭代中不能保证顺序)。

我尝试了以下内容:

在lib中 -

UI.registerHelper 'sequentialFor', () ->
  ret = ""
  for i in [0...@.length]
    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}}

上面的ids是从主要模板助手之一传递的字符串数组。

现在它抱怨我的UI帮助器的返回是[object Object] [object Object]。 为了理智,我知道如果我用以下代码替换我的UI助手:

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

我知道我的main.html中的div会根据需要显示相应的id作为其id属性的一部分。但是,我似乎无法使for循环工作。

我不能直接从帮助器返回main.html中的div,因为我需要用我的新迭代器包装很多div,每个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

2 个答案:

答案 0 :(得分: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}}差得多。

答案 1 :(得分:0)

在我看来,你想为每个ID数组创建一个<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。我误解了你想要实现的目标吗?