Estou no RC4 e estou recebendo o erro Não há diretiva com "exportAs" definida como "ngForm" por causa do meu modelo:
<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>
o 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]);
/// então aqui está a minha 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>
// meu componente ts:
eu estava representando nas formas antigas, assim:
categoryControlGroups:ControlGroup[] = [];
categories:ControlArray = new ControlArray(this.categoryControlGroups);
e agora estou fazendo isso:
categoryControlGroups:FormGroup[] = [];
categories:FormArray = new FormArray(this.categoryControlGroups);
você acha que é a causa do problema ??
Respostas:
Desde 2.0.0.rc6 :
Em resumo:
FormsModule
ao seu@NgModule
.ReactiveFormsModule
ao seu@NgModule
.Portanto, adicione ao seu
app.module.ts
ou equivalente:Não ter um desses módulos pode levar a erros, incluindo o que você enfrenta:
Se você estiver em dúvida, pode fornecer o
FormsModule
e oReactiveFormsModule
juntos, mas eles funcionam totalmente separadamente. Quando você fornece um desses módulos, as diretivas de formulários padrão e provedores desse módulo estarão disponíveis para todo o aplicativo.Formulários antigos usando
ngControl
?Se você tiver esses módulos
@NgModule
, talvez esteja usando diretivas antigas, comongControl
, o que é um problema, porque não hángControl
nos novos formulários. Foi substituído mais ou menos * porngModel
.Por exemplo, o equivalente a
<input ngControl="actionType">
é<input ngModel name="actionType">
, então mude isso em seu modelo.Da mesma forma, a exportação em controles não é
ngForm
mais, é agorangModel
. Portanto, no seu caso, substitua#actionType="ngForm"
por#actionType="ngModel"
.Portanto, o modelo resultante deve ser (
===>
onde alterado):* Mais ou menos porque nem todas as funcionalidades do
ngControl
foram movidas parangModel
. Alguns apenas foram removidos ou estão diferentes agora. Um exemplo é oname
atributo, o próprio caso que você está tendo agora.fonte
<input>
dentro de um*ngFor
? (Provavelmente não vai funcionar, mas tentar isso e me dizer se a mensagem vai embora:<option *ngFor="let actionType of actionTypes; let i = index" value="{{ actionTypes[i].label }}"> {{ actionTypes[i].label }} </option>
)*ngFor
?*ngFor
para algo diferente deactionType
, algum bom?Eu enfrentei o mesmo problema. Eu tinha perdido a tag de importação do módulo de formulários no app.module.ts
fonte
Tive o mesmo problema que foi resolvido adicionando o FormsModule ao .spec.ts:
e, em seguida, adicionar a importação a beforeEach:
fonte
Se você estiver recebendo isto:
Que foi relatado como um bug no github , então provavelmente não é um bug, pois você pode:
[(ngModel)]]=
, OUformControlName
, com angModel
diretiva . Este "foi descontinuado no Angular v6 e será removido no Angular v7" , pois combina as duas estratégias de formulário, tornando-o:Quando você tem uma entrada como esta:
Ele mostrará um aviso sobre estratégias de formulários mistos no console do navegador:
No entanto, se você adicionar o
ngModel
como um valor em uma variável de referência, exemplo:O erro acima é então acionado e nenhum aviso sobre combinação de estratégias é mostrado.
fonte
No meu caso eu tive que adicionar
FormsModule
eReactiveFormsModule
aoshared.module.ts
demais:(obrigado a @Undrium pelo exemplo de código ):
fonte
Tive esse problema e percebi que não havia vinculado meu componente a uma variável.
Alterado
<input #myComponent="ngModel" />
para
<input #myComponent="ngModel" [(ngModel)]="myvar" />
fonte
A maneira correta de usar formulários agora no Angular2 é:
O jeito antigo não funciona mais
fonte
Também percebi que esse problema surge ao tentar combinar abordagens de formulário reativo e modelo de formulário. Eu tinha
#name="ngModel"
e[formControl]="name"
no mesmo elemento. Remover qualquer um corrigiu o problema. Também não que se você usar,#name=ngModel
você também deve ter uma propriedade como esta[(ngModel)]="name"
, caso contrário, você ainda obterá os erros. Isso se aplica ao angular 6, 7 e 8 também.fonte
Verifique se você tem ambos os
ngModel and name
atributos em sua seleção. Além disso, o Select é um componente do formulário e não todo o formulário, portanto, a declaração mais lógica de referência local será: -Mais uma coisa importante é certificar-se de importar
FormsModule
no caso de abordagem orientada por modelo ouReactiveFormsModule
no caso de abordagem reativa. Ou você pode importar ambos, o que também é totalmente normal.fonte
se
ngModule
não estiver funcionando na entrada significa tentar ... remover aspas duplas ao redorngModule
gostar
em vez de acima
fonte
Eu tive esse problema porque eu tive um erro de digitação em meu modelo próximo a [(ngModel)]]. Suporte extra. Exemplo:
fonte