2015-04-21 129 views
2

我正在嘗試在spacebars中編寫自定義迭代器(我正在使用流星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}} 

IDS在上述是通過f的字符串數組rom主要的模板助手之一。

現在它抱怨我的UI幫助器的返回是[object Object] [object Object]。 對於理智的緣故,我知道,如果我取代我的UI幫手:

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

我得到所希望在我的main.html中的股利顯示了相應的ID作爲其id屬性的一部分。但是,我似乎無法使for循環工作。

我不能直接從helper返回main.html中的div,因爲我有很多div需要用新的iterator包裝,每個div都有不同的屬性。

我想簡單的問題是,我如何在spacebars中定義自己的塊迭代器(類似於#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

看樣子對我來說,你想爲每個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,而不是。我誤解了你想要達到的目標嗎?

+0

我很欣賞答案,但這並不能解決我所問的問題。我已經可以像您在答案中一樣創建這些div(每個ID一個)。我試圖解決的問題是(據我所知)spacebars並不能保證#each將始終是同步的(即使使用它的當前實現)。保證順序迭代對我的應用程序非常重要,所以我正在嘗試編寫一個順序迭代器來代替spacebars中找到的標準#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

感謝您的詳細解答。我認爲這是最好的。然而,我不打算將它標記爲解決方案,直到我確定沒有一種標準的方式來編寫自定義迭代器(就像以前那樣)。無論哪種方式都有投票權。 –