Je suis nouveau sur Angular et j'essaie de comprendre comment faire les choses ...
En utilisant AngularJS, comment puis-je injecter un contrôleur à utiliser dans un autre contrôleur?
J'ai l'extrait suivant:
var app = angular.module("testApp", ['']);
app.controller('TestCtrl1', ['$scope', function ($scope) {
$scope.myMethod = function () {
console.log("TestCtrl1 - myMethod");
}
}]);
app.controller('TestCtrl2', ['$scope', 'TestCtrl1', function ($scope, TestCtrl1) {
TestCtrl1.myMethod();
}]);
Lorsque j'exécute cela, j'obtiens l'erreur:
Error: [$injector:unpr] Unknown provider: TestCtrl1Provider <- TestCtrl1
http://errors.angularjs.org/1.2.21/$injector/unpr?p0=TestCtrl1Provider%20%3C-%20TestCtrl1
Dois-je même essayer d'utiliser un contrôleur à l'intérieur d'un autre contrôleur, ou devrais-je en faire un service?
TestCtrl1
plutôt vous transformer en service.Réponses:
Si votre intention est de vous procurer un contrôleur déjà instancié d'un autre composant et que si vous suivez une approche basée sur un composant / une directive, vous pouvez toujours
require
un contrôleur (instance d'un composant) d'un autre composant qui suit une certaine hiérarchie.Par exemple:
Maintenant, l'utilisation de ces composants ci-dessus pourrait être quelque chose comme ceci:
Il existe de nombreuses façons de configurer require .
Ancienne réponse:
Vous devez injecter un
$controller
service pour instancier un contrôleur dans un autre contrôleur. Mais sachez que cela peut entraîner des problèmes de conception. Vous pouvez toujours créer des services réutilisables qui suivent une responsabilité unique et les injecter dans les contrôleurs selon vos besoins.Exemple:
Dans tous les cas, vous ne pouvez pas appeler
TestCtrl1.myMethod()
car vous avez attaché la méthode sur$scope
et non sur l'instance de contrôleur.Si vous partagez le contrôleur, il serait toujours préférable de faire: -
et en consommant faire:
Dans le premier cas, c'est vraiment
$scope
votre modèle de vue, et dans le second cas, c'est l'instance de contrôleur elle-même.la source
var testCtrl1ViewModel = $scope.$new();
êtrevar testCtrl1ViewModel = $rootScope.$new();
? se référer à: docs.angularjs.org/guide/controller @PSLJe suggère que la question que vous devriez vous poser est de savoir comment injecter des services dans les contrôleurs. Les gros services avec des contrôleurs maigres sont une bonne règle de base, c'est-à-dire utilisez simplement des contrôleurs pour coller votre service / usine (avec la logique métier) dans vos vues.
Les contrôleurs obtiennent des ordures collectées lors des modifications d'itinéraire.Par exemple, si vous utilisez des contrôleurs pour conserver la logique métier qui restitue une valeur, vous perdrez l'état sur deux pages si l'utilisateur de l'application clique sur le bouton Précédent du navigateur.
Voici une démonstration de fonctionnement de l'usine injectée dans deux contrôleurs
Aussi, je suggérerais de lire ce tutoriel sur les services / usines.
la source
Il n'est pas nécessaire d'importer / d'injecter votre contrôleur dans JS. Vous pouvez simplement injecter votre contrôleur / contrôleur imbriqué via votre HTML, cela a fonctionné pour moi. Comme :
la source
Cela fonctionne mieux dans mon cas, où TestCtrl2 a ses propres directives.
Cela me donne une erreur indiquant une erreur d'injection scopeProvider.
Cela ne fonctionne pas vraiment si vous avez des directives dans 'TestCtrl1', cette directive a en fait une portée différente de celle créée ici. Vous vous retrouvez avec deux instances de «TestCtrl1».
la source
La meilleure solution:-
// Ici, vous avez le premier appel de contrôleur sans l'exécuter
la source
vous pouvez également utiliser
$rootScope
pour appeler une fonction / méthode du 1er contrôleur à partir du deuxième contrôleur comme celui-ci,la source
utilisez du dactylographie pour votre codage, car il est orienté objet, strictement typé et facile à maintenir le code ...
pour plus d'informations sur typescipt cliquez ici
Voici un exemple simple que j'ai créé pour partager des données entre deux contrôleurs en utilisant Typescript ...
}
la source