Изменение привязки значения к ng-модели не меняет значение входного текста

У меня есть текстовое поле ввода, которое использует привязку ngModel к переменной внутри класса компонента. При нажатии кнопки я хочу очистить вводимый текст, однако изменение значения переменной не меняет вводимый текст.

Я переназначил переменную и вызвал функциюDetectChanges() из ChangeDetectorRef, но она все равно не работает.

Это шаблон, который у меня есть

<form #beaconForm = "ngForm" autocomplete = "off">
        <input #searchBox
               id = "search-query"
               name = "search-query"
               [ngModel] = "inputValue"
               (ngModelChange) = "searchAutocomplete($event)"
               (keydown) = "onKeyDown($event, searchBox)"
               (blur) = "onBlur()"
               (focus) = "onFocused(searchBox.value)">
        <button color = "accent" mat-mini-fab (click) = "action(searchBox.value)"><mat-icon>add</mat-icon></button>
</form>

Затем при нажатии на действие, которое я хочу сделать

private inputValue: string = "";

action(value) {
      this.inputValue = "";
      this.cd.detectChanges();
  }

Я ожидаю, что это очистит ввод, но это не так. Есть идеи, где моя ошибка?

Воспроизведите вашу проблему, я пробовал, здесь работает stackblitz.com/edit/…

Ashish Ranjan 09.04.2019 09:07

И вы должны ввести [(ngModel)] = "inputValue"

J. Knabenschuh 09.04.2019 09:10

@xyz спасибо за демо-код. Ваше решение работает впервые, но поскольку оно не является двусторонним, поэтому, когда я попытался снова ввести ввод, а затем снова нажать кнопку, он не очищает ввод.

user3794740 09.04.2019 09:24

@ user3794740 не стесняйтесь принять ответ, если он вам помог!

Prashant Pimpale 09.04.2019 09:34
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
4
9 227
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Это должно быть [(ngModel)] = "inputValue", если вы хотите двустороннюю привязку данных. [ngModel] отлично работает для односторонней привязки данных.

Попробуйте изменить код следующим образом:

<form #beaconForm = "ngForm" autocomplete = "off">
        <input #searchBox id = "search-query" name = "search-query"
                  //
            [(ngModel)] = "inputValue"
            (ngModelChange) = "searchAutocomplete($event)"
            (keydown) = "onKeyDown($event, searchBox)"
            (blur) = "onBlur()"
            (focus) = "onFocused(searchBox.value)" >
        <button color = "accent" mat-mini-fab (click) = "action(searchBox.value)"> 
           <mat-icon>add</mat-icon>
        </button>
</form>

Stackblitz

[ngModel] подходит, если пользователь хочет сделать одностороннюю привязку
Ashish Ranjan 09.04.2019 09:07

Ах да, сделайте двухстороннюю привязку, чтобы решить проблему. Спасибо

user3794740 09.04.2019 09:08

@PrashantPimpale Я понял после комментария OP, что возникла проблема с односторонней привязкой, лучше придерживаться двухсторонней привязки.

Ashish Ranjan 09.04.2019 09:39

@xyz Я только что узнал, что [ngModel] работает для односторонней привязки данных! Спасибо!

Prashant Pimpale 09.04.2019 09:41

Try this.

[(ngModel)] = {{inputValue}}

Смотрите следующую рабочую версию: https://stackblitz.com/edit/angular-cqpqjj

тс

  inputValue: string = "";

  action(value) {
      this.inputValue = "";
    }

HTML

<form #beaconForm = "ngForm" autocomplete = "off">
        <input #searchBox
               id = "search-query"
               name = "search-query"
               [(ngModel)] = "inputValue">
        <button color = "accent" mat-mini-fab (click) = "action(searchBox.value)">add</button>
</form>
<span>#{{inputValue}}#</span>

После вашего комментария я понял, почему у вас не работает односторонняя привязка.

Начнем с inputValue = 1111

При нажатии кнопки, которая запускает вызов метода action(), мы устанавливаем inputValue на ''. Теперь всякий раз, когда мы напрямую изменяем значение в поле ввода, значение переменной inputValue не изменяется, поскольку ее односторонняя переменная связывается. Так что теперь значение inputValue остается как '', даже если в поле ввода есть какое-то значение. Когда мы вызываем action(), он возвращается к ''. Но подождите, это уже было '', поэтому представление не нужно обновлять (даже ручное обнаружение изменений не сработает, потому что angular не увидит никаких изменений).

Чтобы решить вашу проблему, вы можете использовать [(ngModel)], как это предлагают все. Если вы хотите попробовать, вы все еще можете использовать [ngModel], но просто обновите значение переменной при изменении ввода.

Что-то типа:

searchAutocomplete(e) {
  this.inputValue = e
  // rest of the code
}

Но это просто для ясного понимания, нам не нужен этот обходной путь, если двусторонняя привязка может решить проблему.

https://stackblitz.com/edit/angular-rcdty6?file=src%2Fapp%2Fapp.component.html

Другие вопросы по теме