Wykorzystanie rur wewnątrz ngModel na elementach wejściowych w kątowych

Mam pole wprowadzania HTML.

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

I chcę sformatować jego wartość i użyć istniejącego potoku:

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

I otrzymamy komunikat o błędzie:

Nie można mieć rury w wyrażeniu akcji

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

Author: Lonely, 2016-09-22

5 answers

Nie można używać operatorów wyrażenia szablonowego (pipe, save navigator) w instrukcji szablonu:

(ngModelChange)="Template statements"

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

Https://angular.io/guide/template-syntax#template-statements

Podobnie jak wyrażenia szablonowe, wyrażenia szablonowe używają języka, który wygląda jak JavaScript. Parser instrukcji szablonu różni się od parser wyrażeń szablonowych, a konkretnie obsługuje zarówno podstawowe assignment ( = ) i wyrażenia łańcuchowe (with; or,).

Jednak niektóre składnie JavaScript nie są dozwolone:

  • nowy
  • operatory increment i decrement, ++ i --
  • przypisanie operatorów, np. + = I - =
  • operatory bitowe / i &
  • operatory wyrażenia szablonowego

Więc powinieneś napisać to w następujący sposób:

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

Plunker Przykład

 120
Author: yurzui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 11:09:12
<input [ngModel]="item.value | useMyPipeToFormatThatValue" 
      (ngModelChange)="item.value=$event" name="inputField" type="text" />

Rozwiązaniem jest podział wiązania na Wiązanie jednokierunkowe i Wiązanie zdarzeń - które w rzeczywistości obejmuje składnia [(ngModel)]. {[2] } jest składnią wiązania jednokierunkowego, a {[3] } jest składnią wiązania zdarzeń. Gdy używane są razem - [()] Angular rozpoznaje to jako skrót i łączy dwukierunkowe powiązanie w postaci jednokierunkowego powiązania i powiązania zdarzeń z wartością obiektu komponentu.

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

Zobacz składnię szablonu Aby uzyskać więcej informacji.

 72
Author: KnowHoper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-06 20:54:54

Próbowałem powyższych rozwiązań, ale wartość, która trafia do modelu, była sformatowana, a następnie zwracana i dawała mi błędy currencyPipe. Więc musiałem

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

I na funkcji addToAmount - > zmiana na rozmycie powoduje, że ngModelChange sprawiało mi problemy z kursorem.

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

I usunięcie innych wartości nieliczbowych.

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();
  }
 5
Author: cabaji99,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-25 19:14:06
<input [ngModel]="item.value | currency" (ngModelChange)="item.value=$event"
name="name" type="text" />

Chciałbym dodać jeszcze jeden punkt do zaakceptowanej odpowiedzi.

Jeśli typem kontrolki wejściowej nie jest tekst, rura nie będzie działać.

Pamiętaj o tym i oszczędzaj swój czas.
 1
Author: Tibin Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 11:55:00

Moje rozwiązanie jest podane poniżej searchDetail jest obiektem..

<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">
 0
Author: Bhasker The Navigator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-04 09:54:42