Dentro de un módulo, un controlador puede heredar propiedades de un controlador externo:
var app = angular.module('angularjs-starter', []);
var ParentCtrl = function ($scope, $location) {
};
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope});
});
Ejemplo vía: Enlace muerto : http://blog.omkarpatil.com/2013/02/controller-inheritance-in-angularjs.html
¿Puede un controlador dentro de un módulo heredar de un hermano?
var app = angular.module('angularjs-starter', []);
app.controller('ParentCtrl ', function($scope) {
//I'm the sibling, but want to act as parent
});
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope}); //This does not work
});
El segundo código no funciona ya que $injector.invoke
requiere una función como primer parámetro y no encuentra la referencia a ParentCtrl
.
angularjs
inheritance
angularjs-controller
Federico Elles
fuente
fuente
Respuestas:
Sí, pero puede usar el
$controller
servicio para instanciar el controlador en su lugar: -fuente
ParentCtrl
debería sercontroller
o es posible usar unservice
?$controller
que solo puede usar controladores registrados.$scope
athis
(en teoría)En caso de que esté utilizando la
vm
sintaxis del controlador , esta es mi solución:Desafortunadamente, no puede usar
$controller.call(vm, 'BaseGenericCtrl'...)
, para pasar el contexto actual a la función de cierre (forreload()
), por lo tanto, solo una solución es usar lathis
función heredada interna para cambiar dinámicamente el contexto.fuente
vm
es solo una variable dentro del controlador, no creo que Angular pueda usarlo como se esperaba.Creo que debe usar la fábrica o el servicio para proporcionar funciones o datos accesibles para ambos controladores.
Aquí hay una pregunta similar ---> Herencia del controlador AngularJS
fuente
loading
variable universal para que cuando se carguen datos siempre haga lo mismo, no creo que las fábricas puedan hacer eso. Mi controlador principal puede tener una variable de carga, pero la fábrica no puede manipularlo ... ¿verdad?En respuesta al problema planteado en esta respuesta por gmontague , he encontrado un método para heredar un controlador usando $ controller (), y todavía uso la sintaxis del controlador "como".
En primer lugar, use la sintaxis "como" cuando herede la llamada a $ controller ():
Luego, en la plantilla HTML, si la propiedad está definida por el padre, se usa
parent.
para recuperar las propiedades heredadas del padre; si está definido por un niño, entonces úselochild.
para recuperarlofuente
Bueno, hice esto de otra manera. En mi caso, quería una función que aplicara las mismas funciones y propiedades en otros controladores. Me gustó, excepto por parámetros. De esta manera, todos sus ChildCtrls necesitan recibir $ location.
fuente
Para aquellos que se preguntan, puede extender los controladores de componentes de la misma manera, utilizando el método en la respuesta aceptada.
Use el siguiente enfoque:
Componente principal (para extender desde):
Componente hijo (el que se extiende):
El truco consiste en utilizar controladores con nombre, en lugar de definirlos en la definición del componente.
fuente
Como se menciona en la respuesta aceptada, puede "heredar" las modificaciones de un controlador principal a $ scope y otros servicios llamando a:
$controller('ParentCtrl', {$scope: $scope, etc: etc});
en su controlador secundario.Sin embargo , esto falla si está acostumbrado a usar la sintaxis del controlador 'como', por ejemplo en
Si
foo
se configuró en el controlador principal (víathis.foo = ...
), el controlador secundario no tendrá acceso a él.Como se menciona en los comentarios, puede asignar el resultado de $ controller directamente al ámbito:
Nota: A continuación, debe eliminar la parte 'como'
ng-controller=
porque está especificando el nombre de la instancia en el código y ya no la plantilla.fuente
Estaba usando la sintaxis "Controlador como"
vm = this
y quería heredar un controlador. Tuve problemas si mi controlador principal tenía una función que modificaba una variable.Utilizando las respuestas de IProblemFactory y Salman Abbas , hice lo siguiente para tener acceso a las variables principales:
fuente
Puede usar un mecanismo simple de herencia de JavaScript. Además, no olvide pasar un servicio angular necesario para invocar el método .call.
fuente
Consulte el enlace mencionado a continuación para conocer las herencias de AngularJs.
Controller-Inheritance-in-angularjs
fuente