2016-08-30 2 views
2

Wenn ich versuche, dies zu tun:Wie kann ich IsNaN in Angular2 Ausdruck überprüfen?

dividerColor="{{isNaN(+price) ? 'warn' : 'primary'}}" 

Es gibt mir diese Fehlermeldung:

browser_adapter.ts:82 ORIGINAL EXCEPTION: TypeError: self.context.isNaN is not a function 

Wie kann ich überprüfen, ob mein Objekt eine nicht Nummer in Angular2 Ausdruck ist?

Antwort

1

Dies geschieht, weil die Ausdrücke gegen Ansicht Kontext ausgewertet werden, nicht mit eval, JS Globals sind in Vorlagen nicht verfügbar.

Bedenkt man, dass Number.isNaN polyfilled wurde, kann es technisch mit

{{ (+price).constructor.isNaN(+price) ... }} 

erfolgen Obwohl es ein Hack in Betracht gezogen werden kann. Ich würde vorschlagen, jede einzelne Hilfsfunktion entweder als Klasseneigenschaft oder als Pipe anzugeben.

+0

Wenn ich versuche, dividerColor = "{{(+ Preis) .constructor.isNaN (+ Preis) ? 'warn': 'primary'}} ", es gibt mir diesen Fehler: browser_adapter.ts: 82 ORIGINAL EXCEPTION: TypeError: self._NgModel_74_7.constructor.isNaN ist keine Funktion. Hast du Plunkr oder etwas anderes, mit dem ich testen kann? – Vicheanak

+1

Ich denke, es ist das Beste, nur eine Methode zu Ihrer Komponente hinzuzufügen 'isNan (val) {return isNan (val); } 'und verwende es zum Binden wie in deiner Frage. –

+0

@Vicheanak Die Antwort besagt explizit, dass Number.isNaN [muss polyfilled sein, es ist ES6-Funktion] (https://github.com/zloirock/core-js/blob/master/library/fn/number/is-nan .js). Ohne Polyfill wird es nicht funktionieren. Und es funktioniert mit einem Polyfill. Wie bereits erwähnt, ist es eine sauberere Methode, die 'isNaN' -Heper-Funktion als Klassenmethode zu verwenden. – estus

1

Anstatt die IsNan-Funktion in der Komponente auszusetzen und eine Regel in der Vorlage anzuwenden, denke ich, dass es eine bessere Wahl wäre, eine Eigenschaft mit einer Geschäftsbedeutung offenzulegen. Zum Beispiel:

class MyComp { 
    hasPrice: boolean; 
    someAction() { 
    ... 
    this.hasPrice = !isNaN(this.item.price); 
    } 
} 

<div dividerColor="{{hasPrice ? 'warn' : 'primary'}}"></div> 
2

Sie die Funktion als Eigenschaft der Klasse aussetzen kann:

class MyComponent { 
    isNaN: Function = Number.isNaN; 
} 

<div>dividerColor="{{isNaN(+price) ? 'warn' : 'primary'}}"</div>