Как добавить formcontrol к текстовой области в angular 8 - PullRequest
0 голосов
/ 11 ноября 2019

Я работаю над формой контакта и не могу получить форму для отправки значения textarea с помощью ngModel. Я продолжаю получать сообщение об ошибке из браузера, которое я опубликую ниже

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

// HTML

<form #myform="ngForm" (ngSubmit)="send(myform)" autocomplete="off">
  <ol>
    <li>
      <label>What's your name?</label>
      <input ngModel name="q1" type="text" required/>
    </li>
    <li>
      <label>What's your email address?</label>
      <input ngModel name="q2" type="email" required/>
    </li>
    <li>
      <label>What's the purpose of the message?</label>
      <div>
        <span><input ngModel id="q3a" name="q3" type="radio" value="choice1" /><label for="q3a">choice 1</label></span>
        <span><input ngModel id="q3b" name="q3" type="radio" value="choice2" /><label for="q3b">choice 2</label></span>
        <span><input ngModel id="q3c" name="q3" type="radio" value="choice3" /><label for="q3c">choice 3</label></span>
      </div>
    </li>
    <li>
      <label>This is where your message goes!</label>
      <textArea [(ngModel)]="q4" name="q4" rows="5" cols="60" required>
      </textArea>
    </li>
  </ol>
  <input type="submit"/>
  <button type="submit">Send Message</button>
</form>

// Машинопись

send(form: NgForm){
  console.log(form.value);
}

// Вывод на консоль

{q1: "name", q2: "email", q3: "choice1", q4: undefined}

// Ошибка

Error: Uncaught (in promise): Error: No value accessor for form control with name: 'q4'
Error: No value accessor for form control with name: 'q4'
    at _throwError (forms.js:3313)
    at setUpControl (forms.js:3139)
    at forms.js:5963
    at ZoneDelegate.invoke (zone-evergreen.js:359)
    at Object.onInvoke (core.js:39698)
    at ZoneDelegate.invoke (zone-evergreen.js:358)
    at Zone.run (zone-evergreen.js:124)
    at zone-evergreen.js:855
    at ZoneDelegate.invokeTask (zone-evergreen.js:391)
    at Object.onInvokeTask (core.js:39679)
    at resolvePromise (zone-evergreen.js:797)
    at zone-evergreen.js:862
    at ZoneDelegate.invokeTask (zone-evergreen.js:391)
    at Object.onInvokeTask (core.js:39679)
    at ZoneDelegate.invokeTask (zone-evergreen.js:390)
    at Zone.runTask (zone-evergreen.js:168)
    at drainMicroTaskQueue (zone-evergreen.js:559)"

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Так что в техническом отношении к этому коду возникли две разные проблемы.

Первая проблема была замечательно заявлена ​​поп-командой.

Вторая проблема заключалась в том, что текстовая область не хотела играть хорошос формой.

Чтобы устранить вторую проблему, к текстовой области необходимо было добавить ngDefaultControl, превратив получившийся элемент текстовой области в следующий вид после добавления в него обоих решений.

    <li>
      <label>This is where your message goes!</label>
      <textArea ngModel ngDefaultControl name="q4" rows="5" cols="60" required>
      </textArea>
    </li>
0 голосов
/ 11 ноября 2019

С этим обозначением

<textArea [(ngModel)]="q4" name="q4" rows="5" cols="60" required>

Вы путаете Angular. У него есть и имя, и ngModel, которые он должен обработать, поэтому он поднимает руки и говорит «дух», я имею в виду «неопределенный». Видите, как вы делали это раньше? Попробуйте

<textArea [(ngModel)]="q4" rows="5" cols="60" required>

или

<textArea ngModel name="q4" rows="5" cols="60" required>
...