2015-01-05 7 views
9

Ember migruje do pomocnika non-context switching#each. Dla elementu kompatybilności muszę zrobić to samo z surowej kierownicy.Jak dodać "każdy w" do pracy w kierownicy

Jednak trivial attempt fails

var f = Handlebars.compile("{{#each numbers}}{{this}}{{/each}}"); 
console.log(f({numbers: [1,2,3]})); 
// works 

var f2 = Handlebars.compile("{{#each number in numbers}}{{number}}{{/each}}"); 
console.log(f2({numbers: [1,2,3]})); 
// fails 

Jak uzyskać {{#each number in numbers}} do pracy w surowych kierownicy 2.0?

EDIT

Dodano Bounty tu o przedłużenie kierownicy oparte off https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/lib/ember_compat_handlebars.js który daje nam siebie .. poparcia. Oczywiste jest, że nie jest wbudowany w kierownicę. Oczywiste jest również, że Ember jest w stanie to przedłużyć.

+0

Myślę, że to błąd. Nawet jeśli użyjemy pliku Em.Handlebars.compile, jeśli wystąpi błąd "Nie można odczytać właściwości" kontroler "nieokreślonego" – blessenm

+0

Funkcje skompilowane Ember'a oczekują dodatkowego kontekstu, który nie jest dostarczany przez samo podanie wartości mieszania. Oczekuje widoków, kontenerów, kontrolerów, dzieł. – Kingpin2k

Odpowiedz

4

Pokazuje, jak można to zrobić. Należy jednak pamiętać, że w czasie kompilacji wymagana jest flaga stringParams, która zmienia sposób wywoływania wszystkich helperów, więc prawdopodobnie spowoduje to przerwanie pracy wszystkich innych pomocników, chyba że udostępnisz wersje zgodne z stringParams.

Handlebars.registerHelper('each', function(localName,inKeyword,contextName,options){ 
    var list = this[contextName]; 
    var output = ""; 
    var innerContext = Object.create(this); 
    for (var i=0; i<list.length; i++) { 
    innerContext[localName] = list[i]; 
    output += options.fn(innerContext); 
    } 
    return output; 
}); 

var f = Handlebars.compile("{{#each number in numbers}}{{number}}{{/each}}", { 
    stringParams: true 
}); 

console.log(f({numbers: [1,2,3]})); 
+0

fajne Mam już parametry ciągów, więc powinienem być bezpieczny! –

+0

@SamSaffron, czy nie powinna to być akceptowana odpowiedź? Wygląda na to, że został dodany do twojego rozszerzenia na github. – redbmk

4

Przełączanie bez kontekstu dla każdego pomocnika jest pomocnikiem wprowadzonym w Ember, nie jest częścią biblioteki rdzeni kierownic. Nie będziesz mógł używać go z prostymi kierownicami.

+0

odbył czat z wycats i potwierdził to, ale już to przesłoniliśmy https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/lib/ember_compat_handlebars.js, więc muszę tylko dowiedzieć się, co magia muszę dodać tam –

+0

To nie cała historia podana kierownicy ma non-context przełączanie bloków parametrów na master już na moją odpowiedź i działa jsbin. –

2

Jeśli cię rozumiem pytanie poprawnie, wierzę, że będzie działać.

var hbs = "{{#each this}}{{this}}{{/each}}"; 
var f3 = Handlebars.compile(hbs); 
console.log(f3({numbers: [1,2,3]})); 
console.log(f3({numbers: [3,2,1]})); 

http://jsbin.com/tebayupobu/4/edit

2

Być może nie trzeba zaimplementować to w ogóle od Kierownice porusza się zablokować parametry dla niezarejestrowanych przełączania kontekstu pomocników. Ember używa już bloków w wersji 1.10 Beta (możesz przeczytać o blokach w release notes).

można wykorzystywać najnowsze kompilacje Kierownice uzyskać non kontekst przełączania każdy z nowej składni blok params teraz:

var f = Handlebars.compile("{{#each numbers}}{{this}}{{/each}}"); 
console.log(f({numbers: [1,2,3]})); 

var f = Handlebars.compile("{{#each numbers as |number|}}{{number}}{{/each}}"); 
console.log(f({numbers: [1,2,3]})); 

konsoli:

"123" 
"123" 

Updated JSBin z nową składnią .

Powiązane problemy