Comment utiliser Angulaire 2 du FormBuilder entre plusieurs composants
Je suis en train d'utiliser FormBuilder dans une page j'ai Ionique dans les 2.
Tout d'abord, voici mon environnement de détails:
En cours d'exécution sur Windows 10, et en cours d'exécution ioniques --version me donne 2.0.0-bêta.35
Ici une partie de mes paquet.json fichier:
...
"@angular/common": "2.0.0-rc.3",
"@angular/compiler": "2.0.0-rc.3",
"@angular/core": "2.0.0-rc.3",
"@angular/forms": "^0.3.0",
"@angular/http": "2.0.0-rc.3",
"@angular/platform-browser": "2.0.0-rc.3",
"@angular/platform-browser-dynamic": "2.0.0-rc.3",
"ionic-angular": "2.0.0-beta.10",
"ionic-native": "1.3.2",
"ionicons": "3.0.0"
...
Deuxième, voici les deux fichiers principaux concernés:
insight.ts
import { Component } from '@angular/core';
import {NavController, NavParams} from 'ionic-angular';
import {
REACTIVE_FORM_DIRECTIVES,
FormBuilder,
FormControl,
FormGroup
} from '@angular/forms';
import { App, Insight } from '../../models';
import { InsightProvider } from '../../providers/insight/insight.service';
import { InsightImage, InsightLabel, InsightLink, InsightQuestion, InsightThought, InsightTodo, InsightVideo } from './shared';
@Component({
templateUrl: 'build/pages/insight/insight.html',
directives: [REACTIVE_FORM_DIRECTIVES, InsightImage, InsightLabel, InsightLink, InsightQuestion, InsightThought, InsightTodo, InsightVideo],
providers: [App, InsightProvider, FormBuilder]
})
export class InsightPage {
canAdd: boolean;
showDetails: boolean;
newInsight: Insight;
insightForm: FormGroup;
constructor(private insightProvider: InsightProvider,
private params: NavParams) {
this.insightForm = new FormGroup({
type: new FormControl('', []),
todo: new FormControl('', []),
checked: new FormControl(false, []),
imageUrl: new FormControl('', []),
link: new FormControl('', []),
url: new FormControl('', []),
label: new FormControl('', []),
question: new FormControl('', []),
answer: new FormControl('', []),
title: new FormControl('', []),
details: new FormControl('', []),
});
}
ngOnInit() {
this.canAdd = false;
this.showDetails = true;
}
addNewInsight() {
if (this.newInsight.type) {
this.insightProvider.createInsight(this.newInsight)
.subscribe(response => {
this.newInsight.setId(response.data.id);
this.newInsight.title = '';
console.log(response);
});
}
}
deleteClicked(index: number) {
console.log('Clicked on ' + index);
this.insightProvider.deleteInsight(this.newInsight)
.subscribe(data => {
console.log(data);
});
}
}
insight.html
<form [ngFormModel]="insightForm" (ngSubmit)="createNewInsight()">
<ion-item>
<ion-label for="type">Insight Type</ion-label>
<ion-select name="type" id="type" [formControl]="type">
<ion-option value="label">Label</ion-option>
<ion-option value="thought">Thought</ion-option>
<ion-option value="link">Link</ion-option>
<ion-option value="question">Question</ion-option>
<ion-option value="todo">Todo</ion-option>
<ion-option value="image">Image</ion-option>
<ion-option value="video">Video</ion-option>
</ion-select>
</ion-item>
<div [ngSwitch]="type">
<insight-image [form]="insightForm" *ngSwitchCase="'image'"></insight-image>
<insight-label [form]="insightForm" *ngSwitchCase="'label'"></insight-label>
<insight-link [form]="insightForm" *ngSwitchCase="'link'"></insight-link>
<insight-question [form]="insightForm" *ngSwitchCase="'question'"></insight-question>
<insight-thought [form]="insightForm" *ngSwitchCase="'thought'"></insight-thought>
<insight-todo [form]="insightForm" *ngSwitchCase="'todo'"></insight-todo>
<insight-video [form]="insightForm" *ngSwitchCase="'video'"></insight-video>
</div>
<button type="submit" block primary text-center (click)="addNewInsight()" [disabled]="!newInsight.type">
<ion-icon name="add"></ion-icon> Add Insight
</button>
</form>
Comme vous pouvez le voir, je suis en train de passer le FormGroup Objet en plusieurs composantes, de sorte que je pouvais les utiliser.
Voici un exemple de ce que l'un des composants (version minimale pour le moment):
<ion-item>
<ion-label floating for="link">Link</ion-label>
<ion-input type="text" name="link" id="link" [formControl]="link"></ion-input>
</ion-item>
<ion-item>
<ion-label floating for="url">URL</ion-label>
<ion-input type="text" id="url" name="url" [formControl]="url"></ion-input>
</ion-item>
Le problème je suis confrontée à l'heure actuelle, c'est cette erreur:
Je crois que ce qui se passe est que le FormBuilder est à la recherche pour les prénoms je déclare dans mon fichier d'enregistrement de fichier (tel que todo, imageUrl, lien, etc), mais comme il est dans mes autres composants, il erreurs, sa pensée n'y est pas.
Ce qui pourrait être la raison de cette erreur? J'ai regardé en ligne et ne pouvait pas trouver les questions connexes.
Pour info, la raison pour laquelle j'ai besoin d'eux dans les composants et pas dans la même page, c'est parce que dans l'avenir, la fonctionnalité sera différent pour chaque entrée, il devait donc donner à chaque élément d'une "Responsabilité Unique".
Merci d'avance
ngControl="url"
au lieu de [formControl]="url"
Je viens de mettre à jour l'objet de ma question de mon environnement de détails dans la partie supérieure. Merci de me le rappeler pour vous faire connaître mon environnement. J'ai essayé ngControl="url", mais je suis maintenant "Pas de fournisseur pour ControlContainer". J'ai ajouté "ControlContainer" en tant que fournisseur dans mon composant, mais recevoir le même message d'erreur. Juste au cas où, j'ai essayé de faire formControl="url", j'obtiens le même message d'erreur
Bien Ionic2 est encore une version bêta, s'attendre à des modifications importantes de la fonction les Formes à Venir de la Proposition de Modification. Mon prochain pense à utiliser
formControlName="url"
Merci pour cela. J'ai essayé d'utiliser
formControlName="url"
, mais maintenant, je suis pas No provider for NgControl
. J'ai eu FORM_DIRECTIVES
dans mon composant directives de déclaration, mais en vain. J'ai aussi essayé d'ajouter NgControl à mes fournisseurs. Même résultat.
OriginalL'auteur Daniel Hair | 2016-08-15
Vous devez vous connecter pour publier un commentaire.
Pour tous les autres avec le problème de l'
Le problème est que vous avez oublié de définir
formControlName
sur votre formulaire de saisie des éléments.formControlName="url"
Si vous êtes confrontés à
No provider for NgControl
après la fixation d'entrées que vous avez un problème avec Ionic2 dernières modifications de la Fom de la manipulation. Il y a une chance que vous pouvez corriger votre code par l'importation d'une nouvelle forme de composant:import { disableDeprecatedForms, provideForms } from '@angular/forms';
Mais vous aurez probablement toujours confrontés à des problèmes de plus en plus. Pour corriger votre code:
Bon tutoriel sur FormBuilder et de validation
https://blog.khophi.co/ionic-2-forms-formbuilder-and-validation/
[formControlName]="url"
au lieu deformControlName="url"
Même que ci-dessus, merci pour cette.
Si vous utilisez formArrays vous devez spécifier le nom de
formArrayName="name"
dans un div entourant votre *ngFor boucle qui imprime les multiples formesOriginalL'auteur dafyk
Comme une note générale Angulaire 2+, j'ai trouvé que l'adoption d'une approche cohérente de la spécification formGroupName, formArrayName, et formGroupNamesaved beaucoup de temps, et ce qui restait de ma santé mentale. J'ai perdu beaucoup de temps avant que je n'.
Utiliser
Ou
Ou
Ou
J'ai été continuellement à les mélanger, à ma grande tristesse.
Exemple à partir d'un projet récent:
Cas 1: utilisation Correcte du support de la notation.
Cas 2: utilisation Correcte de la non-support de la notation.
Veuillez noter ci-dessus l'utilisation de "{{" et "}}" pour contraindre Angulaire pour traiter de ce qui serait normalement une valeur de chaîne littérale (en raison de l'utilisation de la n-supports de syntaxe) comme une expression EL.
Cas 3: une utilisation Incorrecte de support de la notation
Dans ce cas, la valeur de formArrayName, "notes", est traité comme une expression EL. Depuis mon composant n'a aucun de ces membres, il évalue à rien. Par conséquent, l'erreur suivante est soutenue:
Heureusement, le numéro de ligne donné à tout le bas de la pile des points de la ligne avec le problème.
Cas 4: l'utilisation Incorrecte de la non-bracketing notation
Dans ce cas, la valeur de formControlName, "je", sera interprétée comme une chaîne littérale, mais nous avons vraiment l'intention de se référer à l'indice de la variable " i " sur le contenant *ngFor directive. Le résultat de cette erreur est:
Merci et bravo à tous les Angular2+ développeurs et d'experts.
OriginalL'auteur jgenoese