2012-04-25 6 views
0

が小さい2時間前に私が始めた:Nested HandlebarsJS #each helpers with EmberJS not workingカスタムforループヘルパー

を私は許容一時的な解決策を自分で考え出した直後に、質問はまだunasweredです。私の問題はそこに止まらなかった。

私は今、オブジェクトの配列をループしますが、最初のインデックスを除外するカスタムヘルパを作成しようとしています.-かなり多く:for(i = 1; i < length; i++) {}。私はあなたの文脈の長さを取得し、オプションに渡す必要があるWebサイトを読んだことがある - あなたの機能が次のように見える:forLoop(context, options)

ただし、コンテキストは実際のオブジェクトではなく文字列です。 .lengthを実行すると、配列のサイズではなく文字列の長さが取得されます。これをオプションに渡すと、何も起こりません。ブラウザのフリーズはあまり言及されません。

私はまず、オプションに渡す前にgetPathを実行しようとしましたが、これは空の文字列を返します。

私は代わりに何をしなければならないのですか?私はHandlebarsJSの前にforループコードを作っていましたが、うまくいきましたが、EmberJSはそれを受けていないようです。

編集:私はかなりも続く:http://handlebarsjs.com/block_helpers.html - >単純なイテレータ

答えて

1

私は長い時間のために試した後、この自分自身を解決しました。

HandlebarsJS方法(サイト上で説明したように)EmberJSのためにもはや有効では以下のように、それは今だん:

function forLoop(context, options) { 
    var object = Ember.getPath(options.contexts[0], context); 
    var startIndex = options.hash.start || 0; 

    for(i = startIndex; i < object.length; i++) { 
     options(object[i]); 
    } 
} 

はヘック、あなたもインデックス値を含めるようにforループを拡張することができます!

function forLoop(context, options) { 
    var object = Ember.getPath(options.contexts[0], context); 
    var startIndex = options.hash.start || 0; 

    for(i = startIndex; i < object.length; i++) { 
     object[i].index = i; 

     options(object[i]); 
    } 
} 

これは、可変開始インデックスを使用したfor-loopです。

ここ
{{#for anArray start=1}} 
    <p>Item #{{unbound index}}</p> 
{{/for}} 
0

が、私はそれをやった方法です(そしてそれが動作します!!!)

はまず、 私は私のモデルのプレビュー 'プロパティ/関数の中で持っていた、:あなたはそうのようなあなたのテンプレートでそれを使用しますそれは単にアレイでarrayControllerを返す:

objectToLoop = Ember.Object.extend({ 
     ... 
    arrayController: [], 
    preview: function() { 
     return this.get('arrayController').toArray(); 
    }.property('[email protected]'), 
     ... 
}); 

その後、私は新しいハンドルヘルパーを追加します。

Handlebars.registerHelper("for", function forLoop(arrayToLoop, options) { 
    var data = Ember.Handlebars.get(this, arrayToLoop, options.fn); 

    if (data.length == 0) { 
     return 'Chargement...'; 
    } 

    filtered = data.slice(options.hash.start || 0, options.hash.end || data.length); 

    var ret = ""; 
    for(var i=0; i< filtered.length; i++) { 
     ret = ret + options.fn(filtered[i]); 
    } 
    return ret;  
}); 

そして、この魔法のおかげで、私はそれを私の見解で呼ぶことができます:

それだけです。

私はそれが最適ではないことを知っているので、改善する方法を知っている人は誰でも教えてください。

関連する問題