Soy nuevo en Angular y trato de descubrir cómo hacer las cosas ...
Usando AngularJS, ¿cómo puedo inyectar un controlador para usar dentro de otro controlador?
Tengo el siguiente fragmento:
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();
}]);
Cuando ejecuto esto, aparece el error:
Error: [$injector:unpr] Unknown provider: TestCtrl1Provider <- TestCtrl1
http://errors.angularjs.org/1.2.21/$injector/unpr?p0=TestCtrl1Provider%20%3C-%20TestCtrl1
¿Debería intentar usar un controlador dentro de otro controlador, o debería hacer de esto un servicio?
TestCtrl1
a un servicio.Respuestas:
Si su intención es obtener un controlador ya instanciado de otro componente y si está siguiendo un enfoque basado en componentes / directivas, siempre puede obtener
require
un controlador (instancia de un componente) de otro componente que sigue una determinada jerarquía.Por ejemplo:
Ahora, el uso de estos componentes anteriores podría ser algo como esto:
Hay muchas formas de configurar require .
Respuesta anterior:
Debe inyectar el
$controller
servicio para crear una instancia de un controlador dentro de otro controlador. Pero tenga en cuenta que esto puede provocar algunos problemas de diseño. Siempre puede crear servicios reutilizables que sigan la responsabilidad única e inyectarlos en los controladores según lo necesite.Ejemplo:
En cualquier caso, no puede llamar
TestCtrl1.myMethod()
porque ha adjuntado el método en la$scope
instancia del controlador y no en la.Si está compartiendo el controlador, siempre será mejor hacer: -
y mientras consumes:
En el primer caso, realmente
$scope
es su modelo de vista, y en el segundo caso es la instancia del controlador en sí.fuente
var testCtrl1ViewModel = $scope.$new();
servar testCtrl1ViewModel = $rootScope.$new();
? consulte: docs.angularjs.org/guide/controller @PSLSugeriría que la pregunta que debería hacerse es cómo inyectar servicios en los controladores. Los servicios gordos con controladores delgados son una buena regla general, también conocida como simplemente use controladores para pegar su servicio / fábrica (con la lógica comercial) en sus puntos de vista.
Los controladores obtienen la basura recolectada en los cambios de ruta, por lo que, por ejemplo, si usa controladores para mantener la lógica comercial que representa un valor, perderá el estado en dos páginas si el usuario de la aplicación hace clic en el botón Atrás del navegador.
Aquí hay una demostración funcional de fábrica inyectada en dos controladores
Además, sugiero leer este tutorial sobre servicios / fábricas.
fuente
No es necesario importar / inyectar su controlador en JS. Simplemente puede inyectar su controlador / controlador anidado a través de su HTML.A mí me funcionó. Me gusta :
fuente
Esto funciona mejor en mi caso, donde TestCtrl2 tiene sus propias directivas.
Esto me da un error que dice error de inyección de scopeProvider.
Esto realmente no funciona si tiene directivas en 'TestCtrl1', esa directiva en realidad tiene un alcance diferente de este creado aquí. Termina con dos instancias de 'TestCtrl1'.
fuente
La mejor solucion:-
// Aquí tienes la primera llamada al controlador sin ejecutarla
fuente
también puede usar
$rootScope
para llamar a una función / método del primer controlador desde el segundo controlador como este,fuente
use mecanografiado para su codificación, porque está orientado a objetos, estrictamente escrito y fácil de mantener el código ...
para más información sobre typescipt haga clic aquí
Aquí un ejemplo simple que he creado para compartir datos entre dos controladores usando TypeScript ...
}
fuente