2016-09-22 36 views
41

Mam pole HTML INPUT.Używanie potoków w trybie ngModel na elementach INPUT w Angular2-View

<input [(ngModel)]="item.value" name="inputField" type="text" /> 

i chcę sformatować swoją wartość i użyć istniejącej rurze:

.... [(ngModel)]="item.value | useMyPipeToFormatThatValue" ..... 

i pojawia się komunikat o błędzie:

nie może mieć rurę w wyrażeniu działania

Jak mogę używać rur w tym kontekście?

Odpowiedz

78

Nie można używać Template expression operators (rury, zapisz nawigator) w terminie oświadczenia szablonu:

(ngModelChange)="Template statements" 

(ngModelChange) = "item.value | useMyPipeToFormatThatValue = $ event"

https://angular.io/docs/ts/latest/guide/template-syntax.html#!#template-expressions

Powinieneś napisać to w następujący sposób:

<input [ngModel]="item.value | useMyPipeToFormatThatValue" 
     (ngModelChange)="item.value=$event" name="inputField" type="text" /> 

Plunker Example

+2

Może ktoś wyjaśnić, dlaczego to musi być podzielony na tak? Próbuję powiązać datę z datą typu: [(ngModel)] = "model.endDate | date: 'y-MM-dd' "i potok nie będzie działał, jednak jeśli zlikwiduję bananową składnię i użyję powyższej składni, to działa dobrze. –

+0

Czy to naprawdę działało? ja mówi: nie mogę mieć fajki w wyrażeniu akcji – rampantNinja

+3

To zadziałało dla mnie! @BlakeRivell "[]" wiąże właściwość w jedną stronę ze źródła danych, aby zobaczyć cel w tym miejscu można zmienić sposób wyświetlania z rurą Jeśli używasz wiązania "()", to odwrotnie, zmiana formatu byłaby tutaj bezużyteczna, więc domyślam się, że to dlatego, że banan w pudełku "[()]" nie działa z potokiem i dzieli je sposób, w jaki można pójść. Możesz przeczytać więcej na ten temat tutaj: https://angular.io/docs/ts/latest/guide/template-syntax.html#!#binding-syntax –

44
<input [ngModel]="item.value | useMyPipeToFormatThatValue" 
     (ngModelChange)="item.value=$event" name="inputField" type="text" /> 

Rozwiązaniem tego problemu jest podział wiązania w jedną stronę wiązania i wiązania imprezy - co składnia [(ngModel)] faktycznie obejmuje. [] to składnia wiążąca w jedną stronę, a () to składnia wiążąca zdarzenia. Używane razem - [()] Angular rozpoznaje to jako skrót i umieszcza wiązanie dwukierunkowe w postaci jednokierunkowego wiązania i zdarzenia wiążącego się z wartością obiektu składowego.

Powodem, dla którego nie można użyć rury [()], jest to, że rury działają tylko z wiązaniami jednokierunkowymi. Dlatego musisz rozdzielić rurę, aby działała tylko w jednokierunkowym wiązaniu i obsługiwać zdarzenie osobno.

Aby uzyskać więcej informacji, zobacz artykuł Angular Template Syntax.

+2

Ładne wyjaśnienie –

+0

Jak dodać wyrażenie warunku, takie jak | numer: "3.2-5"? – Protagonist

+0

To wyjaśnienie jest lepsze niż pierwsze. Dzięki – cabaji99

2

Próbowałem rozwiązania powyżej, ale wartość, która idzie do modelu były sformatowanej wartości, a następnie wracając i dając mi błędy currencyPipe. Musiałem więc

[ngModel]="transfer.amount | currency:'USD':true" 
            (blur)="addToAmount($event.target.value)" 
            (keypress)="validateOnlyNumbers($event)" 

I na funkcję addToAmount -> zmiana na rozmycie spowodować ngModelChange dawał mi kursor problemów.

removeCurrencyPipeFormat(formatedNumber){ 
    return formatedNumber.replace(/[$,]/g,"") 
    } 

Usuwanie pozostałych wartości liczbowych.

validateOnlyNumbers(evt) { 
    var theEvent = evt || window.event; 
    var key = theEvent.keyCode || theEvent.which; 
    key = String.fromCharCode(key); 
    var regex = /[0-9]|\./; 
    if(!regex.test(key)) { 
    theEvent.returnValue = false; 
    if(theEvent.preventDefault) theEvent.preventDefault(); 
    } 
0

moje rozwiązanie jest podana poniżej tutaj searchDetail jest obiekt ..

<p-calendar [ngModel]="searchDetail.queryDate | date:'MM/dd/yyyy'" (ngModelChange)="searchDetail.queryDate=$event" [showIcon]="true" required name="queryDate" placeholder="Enter the Query Date"></p-calendar> 

<input id="float-input" type="text" size="30" pInputText [ngModel]="searchDetail.systems | json" (ngModelChange)="searchDetail.systems=$event" required='true' name="systems" 
      placeholder="Enter the Systems">