Czy istnieje sposób używania funkcji matematycznych w powiązaniach AngularJS?
na przykład
<p>The percentage is {{Math.round(100*count/total)}}%</p>
To skrzypce pokazuje problem
Czy istnieje sposób używania funkcji matematycznych w powiązaniach AngularJS?
na przykład
<p>The percentage is {{Math.round(100*count/total)}}%</p>
To skrzypce pokazuje problem
<p>The percentage is {{(100*count/total)| number:0}}%</p>
więcej w komentarzu poniżej.private Math = Math;
i możesz go użyć.Odpowiedzi:
Musisz wstrzyknąć
Math
do swojego zakresu, jeśli musisz go użyć, ponieważ$scope
nic nie wiesz o matematyce.Najprościej możesz to zrobić
w twoim kontrolerze. Myślę, że dobrym sposobem na zrobienie tego poprawnie byłoby stworzenie usługi matematycznej.
źródło
formatting
, więc użyj filtru.Chociaż przyjęta odpowiedź jest słuszna, że można wstrzyknąć,
Math
aby użyć jej w kanale kątowym, w przypadku tego konkretnego problemu bardziej konwencjonalny / kątowy jest filtr liczb:Możesz przeczytać więcej o
number
filtrze tutaj: http://docs.angularjs.org/api/ng/filter/numberźródło
{{1234.567|number:2}}
renderuje jako1,234.57
lub1 234,57
. Jeśli spróbujesz przekazać to<input type="number" ng-value="1234.567|number:2">
, puste dane wejściowe, ponieważ NIE JEST PRAWIDŁOWA LICZBA, ale zależna od ustawień regionalnych reprezentacja ciągu.Myślę, że najlepszym sposobem na to jest utworzenie filtra, takiego jak ten:
znaczniki wyglądają następująco:
Zaktualizowano skrzypce: http://jsfiddle.net/BB4T4/
źródło
Jest to owłosiona odpowiedź, ponieważ nie podałeś pełnego kontekstu tego, co robisz. Przyjęta odpowiedź będzie działać, ale w niektórych przypadkach spowoduje niską wydajność. To będzie trudniejsze do przetestowania.
Jeśli robisz to jako część statycznej formy, dobrze. Zaakceptowana odpowiedź zadziała, nawet jeśli nie jest to łatwe do przetestowania, i jest pokręcona.
Jeśli chcesz być w tym „Angularny”:
Będziesz chciał ukryć jakąkolwiek „logikę biznesową” (tj. Logikę, która zmienia dane, które mają być wyświetlane) z dala od twoich widoków. Jest to możliwe, abyś mógł przetestować logikę jednostkową, aby nie skończyć ściśle połączeniem kontrolera i widoku. Teoretycznie powinieneś być w stanie skierować kontroler na inny widok i używać tych samych wartości z zakresów. (Jeśli to ma sens).
Należy również wziąć pod uwagę, że wszelkie wywołania funkcji w powiązaniu (takie jak
{{}}
lubng-bind
lubng-bind-html
) będą musiały być oceniane przy każdym skrócie , ponieważ kątowy nie ma możliwości dowiedzenia się, czy wartość się zmieniła, czy nie, jak w przypadku właściwości w zakresie.„Kątowym” sposobem na wykonanie tego byłoby buforowanie wartości we właściwości w zakresie przy zmianie za pomocą zdarzenia ng-change lub nawet $ watch.
Na przykład w formie statycznej:
A teraz możesz to przetestować!
źródło
$window
po co dalej, skoro wydaje się, że działa to z właściwym planemMath.round()
?Math
testów. Alternatywnie możesz utworzyć usługę matematyczną i wstrzyknąć ją.Dlaczego nie owinąć całego obiektu matematyki w filtr?
i użyć:
{{number_var | matematyka: „ceil”}}
źródło
Lepszą opcją jest użycie:
Ustawia domyślną wartość równania na 0 w przypadku, gdy wartości nie są inicjowane.
źródło
Jeśli chcesz zrobić prostą rundę w Angular, możesz łatwo ustawić filtr w swoim wyrażeniu. Na przykład:
{{ val | number:0 }}
Zobacz przykład CodePen i inne opcje filtrowania liczb.
Angular Docs na temat korzystania z filtrów liczb
źródło
Najprostszym sposobem na wykonanie prostej matematyki za pomocą Angulara jest użycie znaczników HTML dla poszczególnych powiązań w razie potrzeby, zakładając, że nie musisz wykonywać obliczeń masy na swojej stronie. Oto przykład:
W takim przypadku wystarczy wykonać obliczenia matematyczne w (), a następnie użyć filtru | aby uzyskać odpowiedź liczbową. Oto więcej informacji na temat formatowania liczb kątowych jako tekstu:
https://docs.angularjs.org/api/ng/filter
źródło
Powiąż globalny obiekt Math z zasięgiem (pamiętaj, aby użyć $ window nie window)
Użyj powiązania w swoim HTML:
Lub utwórz filtr dla określonej funkcji matematycznej, której szukasz:
Użyj filtra w swoim HTML:
źródło
To nie wygląda na bardzo Angularny sposób. Nie jestem do końca pewien, dlaczego to nie działa, ale prawdopodobnie potrzebujesz dostępu do zakresu, aby użyć takiej funkcji.
Moją sugestią byłoby utworzenie filtra. To jest sposób Angularny.
Następnie w swoim HTML zrób to:
źródło
number
Filtr formatuje numer z tysiącami separatorów, więc nie jest to ściśle funkcją matematyki.Co więcej, jego dziesiętny „ogranicznik” nie ma
ceil
żadnych posiekanych miejsc po przecinku (jak w niektórych innych odpowiedziach można by w to uwierzyć), a raczejround
ich odmierzanie.Tak więc dla dowolnej funkcji matematycznej możesz ją wstrzyknąć (łatwiej kpić niż wstrzyknąć cały obiekt Math) w następujący sposób:
Nie trzeba też owijać go w inną funkcję.
źródło
To mniej więcej podsumowanie trzech odpowiedzi (Sary Inés Calderón, Klaxona i Gothburza), ale ponieważ wszystkie one dodały coś ważnego, uważam, że warto przyłączyć się do rozwiązań i dodać więcej wyjaśnień.
Biorąc pod uwagę twój przykład, możesz wykonać obliczenia w swoim szablonie, używając:
Może to jednak skutkować dużą liczbą miejsc po przecinku, dlatego dobrym rozwiązaniem jest użycie filtrów :
Domyślnie filtr liczb pozostawia do trzech cyfr ułamkowych , w tym przypadku argument fractionSize jest bardzo przydatny (
{{ 100 * (count/total) | number:fractionSize }}
), co w twoim przypadku byłoby:Zaokrągli to również wynik:
Pokaż fragment kodu
Ostatnią rzeczą do wspomnienia, jeśli korzystasz z zewnętrznego źródła danych, prawdopodobnie dobrą praktyką jest zapewnienie właściwej wartości zastępczej (w przeciwnym razie możesz zobaczyć NaN lub nic na swojej stronie):
Sidenote: W zależności od specyfikacji możesz być w stanie być bardziej precyzyjnym dzięki swoim awariom / definiować już awarie na niższych poziomach (np
{{(100 * (count || 10)/ (total || 100) | number:2)}}
.). Chociaż nie zawsze może to mieć sens.źródło
Przykład Anges Typescript przy użyciu potoku.
math.pipe.ts
Dodaj do deklaracji @NgModule
następnie użyj w swoim szablonie tak:
źródło