2013-11-14 8 views
5

The bug source code is here.Kierownica Meteor {{#if}} zamienia łańcuchy w obiekty

Załóżmy, że piszę po tablicy w Meteorzie, używając zwykłej pętli {{#each}}. Każdy element tablicy jest ciągiem znaków, a ja wyprowadzam łańcuch w każdym kroku, używając {{this}}. Jak na razie dobrze! Jeśli użyję pomocnika kierownicy do sprawdzenia typeof dla this, otrzymam string. Słodkie! Wszystko jest tak, jak powinno być.

Ale jeśli dodać {{#if something }} -helper wewnątrz {{#each}} (w something prostu zwraca wartość true, a więc leci i wyjścia {{this}}) łańcuch będzie nadal wyglądać dobrze w HTML, ale teraz jest to object w czeku typeof!

To jest bardzo denerwujące, ponieważ cały mój kod może być zależny od tego, czy teraz zwróci false.

Czy robię coś nie tak?

Czy to jest prawdziwy błąd?

Jeśli tak, to czy jest to błąd specyficzny dla Meteor lub specyficzny dla kierownicy?

Dzięki!

Oh: the source link again. Po prostu pociągnij i uruchom meteor i zajrzyj do konsoli przeglądarki.

Odpowiedz

5

To dlatego, że zmienna this ma zawsze być obiektem w JavaScript więc kiedy someFunction.apply(someContext); nazywa się przez kierownicę, JavaScript okazuje someContext do obiektu bez względu na to, co zaczęło się. Zobacz przykład tutaj: http://jsfiddle.net/SyKSE/1/

(. W tym przypadku, someFunction reprezentuje część szablonu, który jest w rachunku {{#if}})

prosta (choć brzydki) Rozwiązaniem byłoby po prostu zawsze przekazać swoje dane jako przedmiot, więc

['this', 'is', 'an', 'array', 'that', 'we\'re', 'looping', 'through']; 

staje:

[{val: 'this'}, {val: 'is'}, {val: 'an'}, {val: 'array'}, {val: 'that'}, {val: 'we\'re'}, {val: 'looping'}, {val: 'through'}]; 

A potem by zmienić szablon spójrz na val zamiast this

+1

Pozdrawiam, świetna odpowiedź! –

+0

Dzięki - dobra praca nad wykonaniem łatwego w użyciu przypadku testowego :) –

+0

Innym obejściem, którego można użyć w przypadku porównywania napisów: _.isEqual (this, stringToCompareAgainst). Zauważ również, że Template.currentData() zwraca ciąg znaków, a nie obiekt – JobJob