Создать динамическое текстовое поле

Мы создаем приложение на Angular 7 с Material Design (не Angular Material!).

Я загружаю некоторые данные после выбора Selectbox, и с этим я пытаюсь создать список, в котором есть текстовые поля.

<ul class = "mdc-list">
  <ng-container *ngFor = "let item of ItemsHeaders; index as i">
    <li class = "mdc-list-item">
      <div #mtf class = "mdc-text-field">
        <input type = "text" id = "my-text-field" attr.name = "{{item[0]}}" [ngModel] = "item[0]" (ngModelChange) = "valuechange(i, item[0], $event)" class = "mdc-text-field__input">
        <label class = "mdc-floating-label" for = "my-text-field">Name</label>
        <div class = "mdc-line-ripple"></div>
      </div>

      <button type = "button" class = "mdc-button mdc-dialog__button" [disabled] = "buttons[i] == 0" (click) = "SaveColumn(item[0])">
        <span class = "mdc-button__label"><i class = "material-icons">save</i></span>
      </button>
    </li>
  </ng-container>
</ul>
      this.ItemsHeaders = data;

      this.buttons = Array(data.length).fill(0);

      new MDCList(document.querySelector('.mdc-list'));

      var buttons = document.querySelectorAll('.mdc-button');

      for (var i = 0; i < buttons.length; ++i) {
        new MDCRipple(buttons[i])
      }

На данный момент я настроил ViewChild:

  @ViewChildren('mtf') textfields;

ngAfterViewInit() {
    this.textfields.changes.subscribe(() => this.setupTextField());
  }

  setupTextField() {
    var textFields = document.querySelectorAll('.mdc-text-field');

    for (var i = 0; i < textFields.length; ++i) {
      new MDCTextField(textFields[i])
    }
  }

Текстовые поля, кажется, созданы, я могу щелкнуть по ним, и эффекты работают, но текст (ngModel), кажется, активируется впоследствии, поэтому он не является частью создания. После того, как я нажимаю на текстовое поле, оно отображается правильно.

Проблема выглядит так, как будто значение записывается после инициализации MDCTextField. Что мне не хватает? Или есть другой способ создать текстовые поля после загрузки данных?

Обновлено:

Я создал пример StackBlitz, вы можете выбрать что-то в поле выбора, и тогда вы увидите, что метка из текстового поля активируется после того, как вы вошли в текстовое поле.

StackBlitz

Код

Попробуйте добавить цикл ngContentInit для манипулирования данными, а затем создайте экземпляр поля ввода в цикле ngAfterViewInit. Это должно помочь, и не могли бы вы добавить демо для решения проблемы! Тогда помочь будет легче!

Divneet 10.05.2019 13:35

Я обновил свой вопрос с примером

d_88_l 10.05.2019 14:17
Тестирование функциональных 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
0
2
223
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я только что решил проблему, с которой вы столкнулись!

Вот рабочая демонстрация! Наслаждайтесь: Д

https://stackblitz.com/edit/angular-jyzsba

все, что нужно было сделать, это изменить класс с mdc-floating-label на mdc-floating-label mdc-floating-label--float-above, когда есть предварительно заполненный текст.

Лучшим/угловым способом было бы:

[ngClass] = "inputString.length>0?'mdc-floating-label mdc-floating-label--float-above':''"

Ну, я могу жить с этим. Спасибо! Но разве не должен быть и «угловой способ» сделать это?

d_88_l 10.05.2019 14:52

На самом деле есть!! вы можете использовать ngClass на основе длины входной строки. Если есть входная строка, вы должны применить эти классы, иначе не применяйте их!!

Divneet 10.05.2019 15:03

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