Tengo tres controladores que son bastante similares. Quiero tener un controlador que estos tres extiendan y compartan sus funciones.
fuente
Tengo tres controladores que son bastante similares. Quiero tener un controlador que estos tres extiendan y compartan sus funciones.
Tal vez usted no se extienden un controlador, pero es posible extender un controlador o hacer un solo controlador mixin de varios controladores.
module.controller('CtrlImplAdvanced', ['$scope', '$controller', function ($scope, $controller) {
// Initialize the super class and extend it.
angular.extend(this, $controller('CtrlImpl', {$scope: $scope}));
… Additional extensions to create a mixin.
}]);
Cuando se crea el controlador principal, también se ejecuta la lógica que contiene. Consulte $ controller () para obtener más información, pero solo se $scope
debe pasar el valor. Todos los demás valores se inyectarán normalmente.
@mwarren , su preocupación es atendida automáticamente por la inyección de dependencia angular. Todo lo que necesita es inyectar $ scope, aunque podría anular los otros valores inyectados si lo desea. Tome el siguiente ejemplo:
(function(angular) {
var module = angular.module('stackoverflow.example',[]);
module.controller('simpleController', function($scope, $document) {
this.getOrigin = function() {
return $document[0].location.origin;
};
});
module.controller('complexController', function($scope, $controller) {
angular.extend(this, $controller('simpleController', {$scope: $scope}));
});
})(angular);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.js"></script>
<div ng-app="stackoverflow.example">
<div ng-controller="complexController as C">
<span><b>Origin from Controller:</b> {{C.getOrigin()}}</span>
</div>
</div>
Aunque $ document no se pasa a 'simpleController' cuando es creado por 'complexController', se inyecta $ document para nosotros.
$.extend()
, simplemente puedes llamar$controller('CtrlImpl', {$scope: $scope});
angular.extend
(o$.extend
) en realidad significa extender el$scope
único, pero si su controlador base también define algunas propiedades (por ejemplothis.myVar=5
), solo tiene accesothis.myVar
en el controlador de extensión cuando usaangular.extend
handleSubmitClick
que llamaríahandleLogin
a su vez que tenía unloginSuccess
yloginFail
. Por lo tanto, en mi controlador extendida después tuve sobrecargar elhandleSubmitClick
,handleLogin
yloginSucess
para la correctaloginSuccess
función que se utilizará.Para la herencia, puede usar patrones de herencia JavaScript estándar. Aquí hay una demostración que usa
$injector
En caso de que use la
controllerAs
sintaxis (que recomiendo), es aún más fácil usar el patrón de herencia clásico:Otra forma podría ser crear una función de constructor "abstracta" que será su controlador base:
Publicación de blog sobre este tema
fuente
Bueno, no estoy exactamente seguro de lo que quiere lograr, pero generalmente los Servicios son el camino a seguir. También puede usar las características de herencia Scope de Angular para compartir código entre controladores:
fuente
$scope.$parent.fx( )
sería una forma mucho más limpia de hacerlo, ya que es ahí donde realmente se define?No extiendes los controladores. Si realizan las mismas funciones básicas, entonces esas funciones deben trasladarse a un servicio. Ese servicio puede inyectarse en sus controladores.
fuente
Otra buena solución tomada de este artículo :
fuente
Puede crear un servicio y heredar su comportamiento en cualquier controlador con solo inyectarlo.
Luego, en su controlador que desea extender desde el servicio reusableCode anterior:
DEMO PLUNKER: http://plnkr.co/edit/EQtj6I0X08xprE8D0n5b?p=preview
fuente
Puedes probar algo como esto (no lo has probado):
fuente
Puede ampliar con un servicio , fábricas o proveedores . son iguales pero con diferente grado de flexibilidad.
Aquí un ejemplo usando factory: http://jsfiddle.net/aaaflyvw/6KVtj/2/
Y aquí también puede usar la función de tienda:
fuente
Puede usar directamente $ controller ('ParentController', {$ scope: $ scope}) Ejemplo
fuente
Puede usar la sintaxis angular "como" combinada con la herencia simple de JavaScript
Ver más detalles aquí http://blogs.microsoft.co.il/oric/2015/01/01/base-controller-angularjs/
fuente
Escribí una función para hacer esto:
Puedes usarlo así:
Pros:
Contras:
fuente
Considero extender los controladores como una mala práctica. Más bien ponga su lógica compartida en un servicio. Los objetos extendidos en JavaScript tienden a ser bastante complejos. Si desea utilizar la herencia, le recomendaría mecanografiado. Aún así, los controladores delgados son la mejor manera de ir desde mi punto de vista.
fuente