AngularJS a les paramètres & où vous pouvez passer un rappel à une directive (par exemple, le mode de rappel AngularJS . Est-il possible de passer un rappel en tant que @Input
pour un composant angulaire (quelque chose comme ci-dessous)? Sinon, quelle serait la chose la plus proche de AngularJS le fait?
@Component({
selector: 'suggestion-menu',
providers: [SuggestService],
template: `
<div (mousedown)="suggestionWasClicked(suggestion)">
</div>`,
changeDetection: ChangeDetectionStrategy.Default
})
export class SuggestionMenuComponent {
@Input() callback: Function;
suggestionWasClicked(clickedEntry: SomeModel): void {
this.callback(clickedEntry, this.query);
}
}
<suggestion-menu callback="insertSuggestion">
</suggestion-menu>
angularjs
angular
typescript
Michail Michailidis
la source
la source
@Input
manière suggérée a rendu mon code spagetti et pas facile à entretenir ..@Output
s sont une façon beaucoup plus naturelle de faire ce que je veux. En conséquence, j'ai changé la réponse acceptéeRéponses:
Je pense que c'est une mauvaise solution. Si vous voulez passer une fonction en composant avec
@Input()
, le@Output()
décorateur est ce que vous recherchez.la source
@Output
etEventEmitter
. Voici donc la documentation Angular pour @Output pour les personnes intéressées.METTRE À JOUR
Cette réponse a été soumise alors que Angular 2 était encore en alpha et que de nombreuses fonctionnalités n'étaient pas disponibles / non documentées. Bien que ce qui suit fonctionnera toujours, cette méthode est désormais entièrement obsolète. Je recommande fortement la réponse acceptée ci-dessous.
Réponse originale
Oui, c'est le cas, mais vous voudrez vous assurer qu'il est correctement défini. Pour cela, j'ai utilisé une propriété pour garantir que cela
this
signifie ce que je veux.la source
Parent -> Child
ngOnInit
je voudrais simplement utiliser:this.theCallback = this.theCallback.bind(this)
et puis vous pouvez passertheCallback
au lieu detheBoundCallback
.Une alternative à la réponse donnée par SnareChops.
Vous pouvez utiliser .bind (this) dans votre modèle pour avoir le même effet. Il n'est peut-être pas aussi propre, mais il enregistre quelques lignes. Je suis actuellement sur angular 2.4.0
la source
@Input
le code devient spaghetti et l'utilisation des@Output
résultats dans un processus plus naturel /Dans certains cas, vous devrez peut-être exécuter la logique métier par un composant parent. Dans l'exemple ci-dessous, nous avons un composant enfant qui rend la ligne du tableau en fonction de la logique fournie par le composant parent:
Donc, je voulais démontrer 2 choses ici:
la source
.bind(this)
[getRowColor]="getColor"
et non[getRowColor]="getColor()"
;-)À titre d'exemple, j'utilise une fenêtre modale de connexion, où la fenêtre modale est le parent, le formulaire de connexion est l'enfant et le bouton de connexion rappelle la fonction de fermeture du parent modal.
Le modal parent contient la fonction pour fermer le modal. Ce parent transmet la fonction close au composant enfant de connexion.
Une fois que le composant de connexion enfant a soumis le formulaire de connexion, il ferme le modal parent à l'aide de la fonction de rappel du parent
la source
Une alternative à la réponse donnée par Max Fahl.
Vous pouvez définir la fonction de rappel comme une fonction de flèche dans le composant parent afin que vous n'ayez pas besoin de le lier.
la source
Passer la méthode avec l'argument, en utilisant .bind à l'intérieur du modèle
la source
Utilisez un motif observable. Vous pouvez mettre une valeur observable (non soumise) dans le paramètre d'entrée et la gérer à partir du composant parent. Vous n'avez pas besoin de fonction de rappel.
Voir l'exemple: https://stackoverflow.com/a/49662611/4604351
la source
Une autre alternative.
L'OP a demandé un moyen d'utiliser un rappel. Dans ce cas, il faisait spécifiquement référence à une fonction qui traite un événement (dans son exemple: un événement de clic), qui doit être traitée comme la réponse acceptée de @serginho le suggère: avec
@Output
etEventEmitter
.Cependant, il existe une différence entre un rappel et un événement: avec un rappel, votre composant enfant peut récupérer des commentaires ou des informations du parent, mais un événement peut uniquement informer que quelque chose s'est produit sans attendre de retour.
Il existe des cas d'utilisation où une rétroaction est nécessaire, par ex. obtenir une couleur ou une liste d'éléments que le composant doit gérer. Vous pouvez utiliser des fonctions liées comme certaines réponses l'ont suggéré, ou vous pouvez utiliser des interfaces (c'est toujours ma préférence).
Exemple
Supposons que vous ayez un composant générique qui opère sur une liste d'éléments {id, nom} que vous souhaitez utiliser avec toutes vos tables de base de données qui contiennent ces champs. Cette composante devrait:
Composant enfant
En utilisant une liaison normale, nous aurions besoin de 1
@Input()
et 3@Output()
paramètres (mais sans aucun retour du parent). Ex.<list-ctrl [items]="list" (itemClicked)="click($event)" (itemRemoved)="removeItem($event)" (loadNextPage)="load($event)" ...>
, mais pour créer une interface, nous n'en aurons besoin que d'une seule@Input()
:Composant parent
Nous pouvons maintenant utiliser le composant liste dans le parent.
Notez que le
<list-ctrl>
reçoitthis
(composant parent) en tant qu'objet de rappel. Un avantage supplémentaire est qu'il n'est pas nécessaire d'envoyer l'instance parente, il peut s'agir d'un service ou de tout objet qui implémente l'interface si votre cas d'utilisation le permet.L'exemple complet se trouve sur ce stackblitz .
la source
La réponse actuelle peut être simplifiée en ...
la source
.bind(this)
alors l'this
intérieur de la fonction de rappel sera cewindow
qui peut ne pas fonctionner selon la matière sur votre cas d'utilisation. Cependant, si vous avez du toutthis
dans le rappel,.bind(this)
c'est nécessaire. Si vous ne le faites pas, cette version simplifiée est la voie à suivre.this
à l'intérieur de la fonction de rappel. C'est juste sujet aux erreurs.