Czy w kierownicy JS jest sposób na włączenie operatorów logicznych do standardowego operatora warunkowego handlebars.js? Coś takiego:
{{#if section1 || section2}}
.. content
{{/if}}
Wiem, że mógłbym napisać własnego pomocnika, ale najpierw chciałbym się upewnić, że nie wymyślę koła na nowo.
javascript
handlebars.js
Mike Robinson
źródło
źródło
registerBoundHelper
nie radzi sobie ze składnią Handlebars. Obejściem tego problemu jest utworzenie niestandardowego widoku: stackoverflow.com/questions/18005111/…Posuwając rozwiązanie o krok dalej. To dodaje operator porównania.
Użyj go w takim szablonie:
Wersja skryptu kawy
źródło
'||'
i'&&'
. Dodałem te skrzynki i są bardzo przydatne.v1 = Ember.Handlebars.get(this, v1, options)
v2 = Ember.Handlebars.get(this, v2, options)
Kierownica obsługuje operacje zagnieżdżone. Zapewnia to dużą elastyczność (i czystszy kod), jeśli piszemy naszą logikę nieco inaczej.
W rzeczywistości możemy dodać różnego rodzaju logikę:
Po prostu zarejestruj tych pomocników:
źródło
options
wykonywania lepiej jest trzymać sięif
metody i łatwiej testować. Dzięki!and
ior
pomocnicy pracują tylko z 2 parametrami, co nie jest tym, czego chcesz. Udało mi się przerobić zarówno pomocników, jakand
ior
pomocników, aby obsługiwały więcej niż dwa parametry. Użyj tej jednej wkładki dlaand
:return Array.prototype.slice.call(arguments, 0, arguments.length - 1).every(Boolean);
i używać tego jednego-liner dlaor
:return Array.prototype.slice.call(arguments, 0, arguments.length - 1).some(Boolean);
.wznosząc to na wyższy poziom, dla tych z was, którzy żyją na krawędzi.
gist : https://gist.github.com/akhoury/9118682 Demo : Fragment kodu poniżej
Pomocnik kierownicy:
{{#xif EXPRESSION}} {{else}} {{/xif}}
pomocnik do wykonania instrukcji IF z dowolnym wyrażeniem
encodeURIComponent(property)
template( {name: 'Sam', age: '20' } )
, zauważ, żeage
tostring
tylko dla, żebym mógłparseInt()
później w tym poście zaprezentowaćStosowanie:
Wynik
JavaScript: (zależy od innego pomocnika - czytaj dalej)
Pomocnik kierownicy:
{{x EXPRESSION}}
Pomocnik do wykonywania wyrażeń javascript
parseInt(property)
template( {name: 'Sam', age: '20' } )
,age
jest tostring
dla celów demonstracyjnych, może być cokolwiek ...Stosowanie:
Wynik:
JavaScript:
Wygląda to na trochę duże, ponieważ rozszerzyłem składnię i skomentowałem prawie każdą linię dla celów przejrzystości
Moar
jeśli chcesz uzyskać dostęp do zakresu wyższego poziomu, ten jest nieco inny, wyrażenie to JOIN wszystkich argumentów, użycie: powiedz, że dane kontekstowe wyglądają tak:
JavaScript:
źródło
{{#each}} ... {{xif ' ../name === this.name' }} {{/each}}
… ale wciąż badam…{{z ...}}
pomocnikeval(expression);
to:eval('(function(){try{return ' + expression + ';}catch(e){}})();');
- Wiem, że robi się to brzydkie, ale nie mogę wymyślić bezpiecznego sposobu na zrobienie tego - pamiętaj, że wykonanie tego nie jest zbyt „szybkie”, nie zrobiłbym tego w wielka iteracja.Jest prosty sposób na zrobienie tego bez pisania funkcji pomocnika ... Można to zrobić całkowicie w szablonie.
Edycja: I odwrotnie, możesz to zrobić:
Edycja / Uwaga: Na stronie kierownicy: handlebarsjs.com oto wartości fałszu:
źródło
Jednym problemem z wszystkimi zamieszczonymi tutaj odpowiedziami jest to, że nie działają one z powiązanymi właściwościami, tj. Warunek if nie jest ponownie oceniany, gdy zmieniają się związane z nim właściwości. Oto nieco bardziej zaawansowana wersja pomocnika obsługującego wiązania. Używa funkcji wiązania ze źródła Embera, która jest również używana do implementacji normalnego
#if
pomocnika Embera .Ta jest ograniczona do pojedynczej wiązanej właściwości po lewej stronie, w porównaniu do stałej po prawej stronie, która moim zdaniem jest wystarczająca do większości praktycznych celów. Jeśli potrzebujesz czegoś bardziej zaawansowanego niż proste porównanie, być może dobrze byłoby zacząć deklarować niektóre obliczone właściwości i
#if
zamiast tego używać normalnego pomocnika.Możesz użyć tego w następujący sposób:
źródło
Ulepszone rozwiązanie, które w zasadzie działa z dowolnym operatorem binarnym (przynajmniej liczby, ciągi nie działają dobrze z eval, UWAŻAJ NA MOŻLIWE WSTRZYKIWANIE SKRYPTÓW JEŻELI UŻYWAĆ NIEZDEFINIOWANEGO OPERATORA Z WEJŚCIAMI UŻYTKOWNIKA):
źródło
Oto rozwiązanie, jeśli chcesz sprawdzić wiele warunków:
Stosowanie:
źródło
Oto link do pomocnika bloku, którego używam: pomocnika bloku porównania . Obsługuje wszystkie standardowe operatory i pozwala pisać kod, jak pokazano poniżej. To naprawdę bardzo przydatne.
źródło
Podobnie do odpowiedzi Jima, ale przy odrobinie kreatywności możemy również zrobić coś takiego:
Następnie, aby go użyć, otrzymujemy coś takiego:
Sugerowałbym przeniesienie obiektu poza funkcję dla lepszej wydajności, ale w przeciwnym razie możesz dodać dowolną funkcję porównywania, w tym „i” oraz „lub”.
źródło
Inną alternatywą jest użycie nazwy funkcji w
#if
.#if
Wykryje jeśli parametr jest funkcja i jeśli jest to będzie nazwać i używać jej powrót do odprawy truthyness. Poniżej myFunction pobiera aktualny kontekst jakothis
.źródło
Niestety żadne z tych rozwiązań nie rozwiązuje problemu operatora „OR” cond1 || cond2 ”.
Użyj „^” (lub) i sprawdź, czy inaczej cond2 jest prawdziwe
{{#if cond1}} ZRÓB DZIAŁANIE {{^}} {{#if cond2}} ZRÓB DZIAŁANIE {{/ if}} {{/ if}}
Łamie zasadę SUCHEGO. Dlaczego więc nie użyć częściowego, aby zmniejszyć bałagan?
źródło
Rozumiem, dlaczego chcesz stworzyć pomocnika w sytuacjach, w których masz wiele różnych porównań do wykonania w szablonie, ale dla stosunkowo niewielkiej liczby porównań (lub nawet jednego, co doprowadziło mnie do tej strony w pierwsze miejsce), prawdopodobnie łatwiej byłoby zdefiniować nową zmienną kierownicy w wywołaniu funkcji renderowania widoku, na przykład:
Przejdź do kierownicy podczas renderowania:
a następnie w szablonie kierownicy:
Wspominam o tym dla uproszczenia, a także dlatego, że jest to odpowiedź, która może być szybka i pomocna przy jednoczesnym zachowaniu logicznej natury Kierownic.
źródło
Zainstaluj dodatek Ember Truth Helpers , uruchamiając poniższe polecenie
możesz zacząć używać większości operatorów logicznych (eq, not-eq, not, i, lub gt, gte, lt, lte, xor).
Możesz nawet dołączyć podwyrażenie, aby przejść dalej,
źródło
Kolejne krzywe rozwiązanie dla trójskładnika:
Lub prosty pomocnik koalesce:
Ponieważ te postacie nie mają specjalnego znaczenia w znacznikach kierownicy, możesz ich używać do nazw pomocników.
źródło
Znalazłem pakiet npm wykonany przy pomocy CoffeeScript, który zawiera wiele niesamowicie przydatnych pomocników dla Kierownic. Przejrzyj dokumentację pod następującym adresem URL:
https://npmjs.org/package/handlebars-helpers
Możesz zrobić to,
wget http://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.2.6.tgz
aby je pobrać i zobaczyć zawartość pakietu.Będziesz w stanie robić rzeczy takie jak
{{#is number 5}}
lub{{formatDate date "%m/%d/%Y"}}
źródło
jeśli chcesz tylko sprawdzić, czy jest obecny jeden lub drugi element, możesz użyć tego niestandardowego pomocnika
lubię to
jeśli potrzebujesz również mieć „lub” do porównania wartości zwracanych przez funkcję , wolę dodać inną właściwość, która zwraca pożądany wynik.
Szablony powinny być mimo wszystko logiczne!
źródło
Dla tych, którzy mają problemy z porównywaniem właściwości obiektu, w pomocniku dodaj to rozwiązanie
Pomocnik Ember.js nieprawidłowo rozpoznaje parametr
źródło
Właśnie przyszedł do tego postu z wyszukiwarki Google, w jaki sposób sprawdzić, czy ciąg znaków jest równy innym ciągom znaków.
Korzystam z HandlebarsJS po stronie serwera NodeJS, ale używam również tych samych plików szablonów w interfejsie, używając wersji HandlebarsJS w przeglądarce do parsowania. Oznaczało to, że gdybym chciał niestandardowego pomocnika, musiałbym zdefiniować go w 2 oddzielnych miejscach lub przypisać funkcję do przedmiotowego obiektu - zbyt duży wysiłek !!
Ludzie zapominają o tym, że niektóre obiekty mają funkcje dziedziczenia, których można używać w szablonie wąsów. W przypadku ciągu:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
An Array containing the entire match result and any parentheses-captured matched results; null if there were no matches.
Możemy użyć tej metody, aby zwrócić tablicę dopasowań lub
null
jeśli nie znaleziono żadnych dopasowań. Jest to idealne, ponieważ przeglądanie dokumentacji HandlebarsJS http://handlebarsjs.com/builtin_helpers.htmlYou can use the if helper to conditionally render a block. If its argument returns false, undefined, null, "", 0, or [], Handlebars will not render the block.
Więc...
AKTUALIZACJA:
Po przetestowaniu we wszystkich przeglądarkach nie działa to w przeglądarce Firefox . HandlebarsJS przekazuje inne argumenty do wywołania funkcji, co oznacza, że po wywołaniu String.prototype.match drugi argument (tj. Flagi Regexp dla wywołania funkcji dopasowania zgodnie z powyższą dokumentacją) wydaje się być przekazywany. Firefox postrzega to jako przestarzałe użycie String.prototype.match i dlatego się psuje.
Obejściem tego problemu jest zadeklarowanie nowego funkcjonalnego prototypu dla obiektu String JS i użycie go zamiast tego:
Upewnij się, że ten kod JS jest uwzględniony przed uruchomieniem funkcji Handlebars.compile (), a następnie w szablonie ...
źródło
Tutaj mamy waniliowe kierownice do wielu logicznych && i || (i lub):
Nie jestem pewien, czy można „bezpiecznie” używać „i” i „lub” ... może zmienić na coś takiego jak „op_and” i „op_or”?
źródło
Prawidłowe rozwiązanie dla AND / OR
Następnie zadzwoń w następujący sposób
BTW: Zauważ, że podane tutaj rozwiązanie jest nieprawidłowe, nie odejmuje ostatniego argumentu, który jest nazwą funkcji. https://stackoverflow.com/a/31632215/1005607
Jego oryginalny AND / OR opierał się na pełnej liście argumentów
Czy ktoś może zmienić tę odpowiedź? Właśnie straciłem godzinę, próbując naprawić coś w odpowiedzi zalecanej przez 86 osób. Rozwiązaniem jest odfiltrowanie ostatniego argumentu, który jest nazwą funkcji.
Array.prototype.slice.call(arguments, 0, arguments.length - 1)
źródło
Postępując zgodnie z tymi 2 przewodnikami w sposób pozwalający użytkownikom na definiowanie niestandardowych instrukcji powiązanych z instrukcją i niestandardowych powiązanych pomocników , mogłem dostosować moje udostępnione widoki w tym poście przy stosie przepływu, aby użyć tego zamiast standardowego # instrukcja if. To powinno być bezpieczniejsze niż tylko wrzucanie tam #if.
Pomocnicy związani w niestandardach w tym systemie są wyjątkowi.
Korzystam z ember cli projektu do budowy aplikacji ember.
Obecna konfiguracja w momencie pisania tego postu:
źródło
W Ember.js możesz użyć inline if helper in if block helper. Może zastąpić
||
operator logiczny, na przykład:źródło
Możesz to zrobić po prostu za pomocą operatora logicznego, takiego jak pokazano poniżej:
Przed zamknięciem, jeśli potrafisz napisać logikę biznesową
źródło
Możesz użyć następującego kodu:
źródło
Oto podejście, którego używam dla ember 1.10 i ember-cli 2.0.
Następnie możesz użyć go w swoich szablonach:
Gdzie argumenty do wyrażenia są przekazywane jako
p0
,p1
,p2
etc ip0
może być także określany jakothis
.źródło