2016-06-15 16 views
12

Tu drapie mi głowę. Używam angularJS i próbuję użyć wyrażenia zawierającego wywołanie parseInt. .AngularJS: to 0 == 2?

{{0 == 2}} 

... drukuje się fałszywy jak oczekiwano)

Jednak, kiedy próbuję:

{{parseInt(0) == parseInt(2)}} 

... to wypisuje ... prawdziwą!

Jak to jest możliwe?

+2

można utworzyć [mcve]? – dave

+1

https://www.destroyallsoftware.com/talks/wat;) – Stefan

Odpowiedz

7

To dlatego, że parseInt nie jest zdefiniowany w twoim zasięgu.

http://jsfiddle.net/halirgb/Lvc0u55v/

+0

co rozumiesz przez parseInt nie jest zdefiniowane? –

+0

możesz zobaczyć parseInt tutaj w3schools.com/jsref/jsref_parseint.asp? –

+2

On oznacza "parseInt()", ponieważ funkcja nie jest zdefiniowana w twoim zasięgu. 'parseInt' jest funkcją JavaScript, ale w {{}} Angular nie uważa tego za JavaScript. Mapuje go do zakresu kontrolera. Dlatego 'undefined == undefined' jest prawdziwe. –

13

kątowej nie korzysta z JavaScript na eval() ocenić wyrażeń. Zamiast tego usługa Angular's $parse przetwarza te wyrażenia.

wyrażenia kątowe nie mają dostępu do zmiennych globalnych jak window, document lub location. To ograniczenie jest zamierzone. To zapobiega przypadkowemu dostępowi do stanu globalnego - wspólne źródło subtelnych bugów .

Refer

w HTML

Zarówno parseInt(0) i parseInt(2) są niezdefiniowane w html.

Więc {{undefined==undefined}} jest true .Beacause parseInt jest Javascript function.So nie można uzyskać dostęp do funkcji parseInt w bok {{}}. [Tu parseInt nie jest zmienny zakres]

Rozwiązanie

Jeśli chcesz to zrobić,

określić parseInt w kontrolerze,

$scope.parseInt = parseInt; 

Następnie można użyć parseInt metoda w twoim html

+0

dzięki, ale dlaczego? – jazzblue

+0

możesz zobaczyć parseInt tutaj http://www.w3schools.com/jsref/jsref_parseint.asp? –

+0

Ta odpowiedź pomoże ci, http: //stackoverflow.com/a/26294266/3901856 – Muhsin

2

Nie można wykonać regularnego JS w wyrażeniu kątowym n. Twoje wyrażenia zostaną ocenione na podstawie bieżącego zakresu. Tak więc parseInt jest undefined w bieżącym zakresie.

Jeśli ustawisz parseInt jako odniesienie do funkcji, zadziała.

$scope.parseInt = parseInt; 
-1

Masz porównanie obu niezdefiniowanych wartości więc wynik będzie prawdziwą.

Nie można wywołać metody javascript (parseInt) za pomocą dyrektyw kątowych (ng-blur, ng-change, ..), które można uzyskać, tworząc funkcje kątowe.

Rozwiązanie 1:

{{0*1 == 2*1}} 

Wystarczy zrobić sztuczka do konwersji na Integer przez mnożenie z 1 (0 * 1 = 0, 2 * 1 = 1).

Roztwór 2:

{{parseInt(0) == parseInt(2)}} 

Kontroler:

// To Convert specific format 
$scope.parseInt = funtion(value){ 
    return parseInt(value,10); 
} 

lub

$scope.parseInt = parseInt; 

odniesienia here

+0

Czy opracować więcej na temat odpowiedzi, i dlaczego jest to poprawna odpowiedź, w przeciwnym razie zostanie ona usunięta. –

+0

Chociaż ten kod może odpowiedzieć na pytanie, zapewniając dodatkowy kontekst dotyczące _why_ i/lub _how_ to odpowiada pytanie znacząco poprawić jej długoterminowy wartość. Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienie. –

+0

Dziękuję guyz !! za poprawienie mnie :-) –

1

Dzieje się tak dlatego, że widok jest dołączony do kontrolera przez zakres.

Więc cokolwiek piszemy w świetle albo zmiennej lub funkcji lub cokolwiek to jest renderowany przez dołączenie $ zakres przed nim.

np. a wynosi renderowany jako $ scope.a w widoku

Więc kiedy piszemy parseInt, jego świadczonych przez $ scope.parseInt który nie jest zdefiniowany.

sprzętów define $ scope.parseInt = parseInt w kontrolerze dołączonej do konkretnego widoku