Ошибка Angular2: нет директивы с параметром exportAs, установленным в ngForm

Я использую RC4 и получаю сообщение об ошибке Нет директивы с параметром "exportAs", установленным на "ngForm" из-за моего шаблона:

<div class="form-group">
        <label for="actionType">Action Type</label>
        <select
            ngControl="actionType" 
      ===>  #actionType="ngForm" 
            id="actionType" 
            class="form-control" 
            required>
            <option value=""></option>
            <option *ngFor="let actionType of actionTypes" value="{{ actionType.label }}">
                {{ actionType.label }}
            </option>
        </select> 
    </div>

boot.ts:

import {disableDeprecatedForms, provideForms} from '@angular/forms'; 

 import {bootstrap} from '@angular/platform-browser-dynamic';
 import {HTTP_PROVIDERS, Http} from '@angular/http';
 import {provideRouter} from '@angular/router';

import {APP_ROUTER_PROVIDER} from './routes';

import {AppComponent} from './app.component';

bootstrap(AppComponent, [ disableDeprecatedForms(), provideForms(), APP_ROUTER_PROVIDER, HTTP_PROVIDERS]);

/// вот мой DropdownList:

<fieldset ngControlGroup="linkedProcess" >
                     <div ngControlGroup="Process" >
                         <label>Linked Process</label>
                          <div class="form-group">       
        <select 
            ngModel
            name="label" 
            #label="ngModel" 
            id="label" 
            class="form-control" required
            (change)="reloadProcesse(list.value)" 
            #list>
            <option value=""></option>
            <!--<option value=`{{ActionFormComponent.getFromString('GET'')}}`></option>-->                 
            <option *ngFor="let processus of linkedProcess?.processList?.list; let i = index" 
            value="{{ processus[i].Process.label}}">
                {{processus.Process.label}}
            </option>
        </select> 
        </div>
     </div>

// мой компонент ts:

Я представлял это в старых формах вот так:

 categoryControlGroups:ControlGroup[] = [];
     categories:ControlArray = new ControlArray(this.categoryControlGroups);

и теперь я делаю это:

categoryControlGroups:FormGroup[] = [];
     categories:FormArray = new FormArray(this.categoryControlGroups);

вы думаете, что это причина проблемы ??


person Anna    schedule 28.07.2016    source источник
comment
Какую версию ты используешь? Вы форсировали формы?   -  person acdcjunior    schedule 29.07.2016


Ответы (11)


Поскольку 2.0.0.rc6 < / а>:

формы: устаревшие функции provideForms() и disableDeprecatedForms() удалены. Вместо этого импортируйте FormsModule или ReactiveFormsModule из @angular/forms.

Суммируя:

Итак, добавьте к своему app.module.ts или аналогичному:

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; // <== add the imports!
 
import { AppComponent }  from './app.component';
 
@NgModule({
  imports: [
    BrowserModule,
    FormsModule,                               // <========== Add this line!
    ReactiveFormsModule                        // <========== Add this line!
  ],
  declarations: [
    AppComponent
    // other components of yours
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }

Отсутствие одного из этих модулей может привести к ошибкам, в том числе к той, с которой вы столкнетесь:

Невозможно выполнить привязку к ngModel, поскольку это неизвестное свойство input.

Невозможно выполнить привязку к 'formGroup', поскольку это неизвестное свойство 'form'

Нет директивы с параметром exportAs, установленным в ngForm

Если у вас есть сомнения, вы можете предоставить оба FormsModule и ReactiveFormsModule вместе, но они полностью функциональны по отдельности. Когда вы предоставляете один из этих модулей, директивы форм по умолчанию и поставщики из этого модуля будут доступны для всего приложения.


Старые формы, использующие ngControl?

Если у вас есть эти модули в вашем @NgModule, возможно, вы используете старые директивы, такие как ngControl, что является проблемой, потому что в новых формах нет ngControl. Он был заменен более или менее * на ngModel.

Например, эквивалент <input ngControl="actionType"> - <input ngModel name="actionType">, поэтому измените это в своем шаблоне.

Точно так же экспорт в элементах управления больше не ngForm, теперь ngModel. Итак, в вашем случае замените #actionType="ngForm" на #actionType="ngModel".

Итак, итоговый шаблон должен быть (===>s где изменено):

<div class="form-group">
    <label for="actionType">Action Type</label>
    <select
  ===>  ngModel
  ===>  name="actionType" 
  ===>  #actionType="ngModel" 
        id="actionType" 
        class="form-control" 
        required>
        <option value=""></option>
        <option *ngFor="let actionType of actionTypes" value="{{ actionType.label }}">
            {{ actionType.label }}
        </option>
    </select> 
</div>

* Более или менее потому, что не все функции ngControl были перенесены в ngModel. Некоторые просто были удалены или сейчас другие. Примером может служить атрибут name, тот самый случай, который у вас сейчас есть.

person acdcjunior    schedule 29.07.2016
comment
спасибо за ваш ответ, когда я его изменил, у меня появляется ошибка Невозможно назначить ссылку или переменную, это вам что-то говорит ?? - person Anna; 29.07.2016
comment
Хм .. может быть где то еще. У вас есть <input> внутри *ngFor? (Возможно, не сработает, но попробуйте это и сообщите мне, если сообщение исчезнет: <option *ngFor="let actionType of actionTypes; let i = index" value="{{ actionTypes[i].label }}"> {{ actionTypes[i].label }} </option>) - person acdcjunior; 29.07.2016
comment
У вас есть ‹input› внутри *ngFor? - person acdcjunior; 29.07.2016
comment
Попробуйте переименовать переменную внутри *ngFor во что-то другое, кроме actionType, хорошо? - person acdcjunior; 29.07.2016
comment
нет, я не знаю, но у меня есть раскрывающийся список выбора, который я повторяю, я не знаю, является ли он источником ошибки, пожалуйста, взгляните на мой обновленный вопрос ... - person Anna; 29.07.2016
comment
Разве внутри option *ngFor {{processus.Process.label}} не должно быть {{processus[i].Process.label}} (или наоборот, внутри <option value)? ..Также, есть ли в вашем коде оба выбора, которые вы добавили к вопросу, или только второй? - person acdcjunior; 29.07.2016
comment
двое из них :( - person Anna; 29.07.2016
comment
О {{processus.Process.label}} или {{processus[i].Process.label}}, какой из них правильный? - person acdcjunior; 29.07.2016
comment
без индекса i первый: {{processus.Process.label}} довольно хорошо работал с устаревшими формами, и теперь даже после попытки вашего предложения ошибка все еще здесь - person Anna; 29.07.2016
comment
ngControlGroup в новых формах был заменен на ngModelGroup, вы можете его изменить? - person acdcjunior; 29.07.2016
comment
Я думаю, что ошибка возникла из-за моего компонента, а не из шаблона, я обновил свой вопрос, чтобы показать вам определение: - person Anna; 29.07.2016
comment
добавление formsModule в мой модуль приложения сработало для меня - person pepitomb; 28.06.2018

Я столкнулся с той же проблемой. Я пропустил тег импорта модуля форм в app.module.ts

import { FormsModule } from '@angular/forms';

@NgModule({
    imports: [BrowserModule,
        FormsModule
    ],
person Chandan    schedule 05.12.2016
comment
спасибо, все сработало нормально, но должно быть app.module.ts, а не app.module.component.ts - person Salim; 22.06.2017
comment
Это не работает для меня, хотя я уже поместил импорт FormsModule в свой app.module - person emirhosseini; 10.08.2018

У меня была та же проблема, которая была решена путем добавления FormsModule в .spec.ts:

import { FormsModule } from '@angular/forms';

а затем добавляем импорт в beforeEach:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    imports: [ FormsModule ],
    declarations: [ YourComponent ]
  })
.compileComponents();
}));
person Juha Ristolainen    schedule 21.03.2017

Если вместо этого вы получаете это:

Ошибка: ошибки синтаксического анализа шаблона:

Нет директивы, если для параметра exportAs установлено значение ngModel.

Что было сообщалось как ошибка в github, то, скорее всего, это не ошибка, так как вы могли :

  1. есть синтаксическая ошибка (например, лишняя скобка: [(ngModel)]]=), ИЛИ
  2. смешивать директивы реактивных форм, например formControlName, с директивой ngModel. Этот устарел в Angular v6 и будет удален в Angular v7, так как это смешивает обе стратегии формы, что делает его:
  • похоже, что используется фактическая директива ngModel, но на самом деле это свойство ввода / вывода с именем ngModel в директиве реактивной формы, которое просто аппроксимирует (частично) его поведение. В частности, он позволяет получать / устанавливать значение и перехватывать события значения. Однако некоторые другие функции ngModel - например, задержка обновлений с помощьюngModelOptions или экспорт директивы - просто не работают (...)

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

  • Чтобы обновить свой код до версии 7, вам нужно будет решить, следует ли придерживаться директив реактивной формы (и получать / устанавливать значения с помощью шаблонов реактивных форм) или переключиться на директивы, управляемые шаблонами < / сильный>.

Когда у вас есть такой ввод:

<input formControlName="first" [(ngModel)]="value">

Он покажет предупреждение о стратегиях смешанной формы в консоли браузера:

Похоже, вы используете ngModel в том же поле формы, что и formControlName.

Однако, если вы добавите ngModel в качестве значения в ссылочную переменную, например:

<input formControlName="first" #firstIn="ngModel" [(ngModel)]="value">

Затем срабатывает указанная выше ошибка, и предупреждение о смешивании стратегий не отображается.

person CPHPython    schedule 27.02.2019

В моем случае мне также пришлось добавить FormsModule и ReactiveFormsModule в shared.module.ts:

(спасибо @Undrium за пример кода):

import { NgModule }                                 from '@angular/core';
import { CommonModule }                             from '@angular/common';
import { FormsModule, ReactiveFormsModule }         from '@angular/forms';

@NgModule({
  imports:      [
    CommonModule,
    ReactiveFormsModule
  ],
  declarations: [],
  exports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule
  ]
})
export class SharedModule { }
person Dirk    schedule 14.06.2018
comment
Это решило мою проблему. Недостаточно просто добавить его в app.module - person emirhosseini; 10.08.2018

У меня была эта проблема, и я понял, что не привязал свой компонент к переменной.

Измененный

<input #myComponent="ngModel" />

to

<input #myComponent="ngModel" [(ngModel)]="myvar" />

person birwin    schedule 21.12.2018

Правильный способ использования форм теперь в Angular2:

<form  (ngSubmit)="onSubmit()">

        <label>Username:</label>
        <input type="text" class="form-control"   [(ngModel)]="user.username" name="username" #username="ngModel" required />

        <label>Contraseña:</label>
        <input type="password" class="form-control"  [(ngModel)]="user.password" name="password" #password="ngModel" required />


    <input type="submit" value="Entrar" class="btn btn-primary"/>

</form>

Старый способ больше не работает

person ioses    schedule 22.03.2017

Также осознал, что эта проблема возникает при попытке объединить подходы к реактивной форме и шаблонной форме. У меня были #name="ngModel" и [formControl]="name" на одном элементе. Удаление любого из них устранило проблему. Также не то, что если вы используете #name=ngModel, у вас также должно быть свойство, такое как это [(ngModel)]="name", иначе вы все равно получите ошибки. Это относится и к угловым 6, 7 и 8.

person Samuel Mutemi    schedule 07.08.2019

Убедитесь, что у вас есть оба атрибута ngModel and name в вашем select. Также Select является компонентом формы, а не всей формой, поэтому более логичным объявлением локальной ссылки будет: -

<div class="form-group">
    <label for="actionType">Action Type</label>
    <select
            ngControl="actionType" 
      ===>  #actionType="ngModel"
            ngModel    // You can go with 1 or 2 way binding as well
            name="actionType"
            id="actionType" 
            class="form-control" 
            required>
            <option value=""></option>
            <option *ngFor="let actionType of actionTypes" value="{{ actionType.label }}">
                {{ actionType.label }}
            </option>
        </select> 
    </div>

Еще одна важная вещь - убедитесь, что вы импортируете либо FormsModule в случае подхода, основанного на шаблонах, либо ReactiveFormsModule в случае подхода, основанного на реакциях. Или вы можете импортировать оба, что тоже нормально.

person Rohan Shenoy    schedule 19.02.2019

если ngModule не работает во вводе, значит попробуйте ... удалите двойные кавычки вокруг ngModule

нравиться

<input #form="ngModel" [(ngModel)]......></input>

вместо выше

<input #form=ngModel [(ngModel)]......></input> try this
person user13482587    schedule 06.05.2020

У меня возникла эта проблема из-за опечатки в моем шаблоне рядом с [(ngModel)]]. Дополнительный кронштейн. Пример:

<input id="descr" name="descr" type="text" required class="form-control width-half"
      [ngClass]="{'is-invalid': descr.dirty && !descr.valid}" maxlength="16" [(ngModel)]]="category.descr"
      [disabled]="isDescrReadOnly" #descr="ngModel">
person Raman Zhylich    schedule 18.01.2018