Tengo una directiva que tiene su propio controlador. Vea el siguiente código:
var popdown = angular.module('xModules',[]);
popdown.directive('popdown', function () {
var PopdownController = function ($scope) {
this.scope = $scope;
}
PopdownController.prototype = {
show:function (message, type) {
this.scope.message = message;
this.scope.type = type;
},
hide:function () {
this.scope.message = '';
this.scope.type = '';
}
}
var linkFn = function (scope, lElement, attrs, controller) {
};
return {
controller: PopdownController,
link: linkFn,
replace: true,
templateUrl: './partials/modules/popdown.html'
}
});
Esto está destinado a ser un sistema de notificación de errores / notificaciones / advertencias. Lo que quiero hacer es desde otro controlador (no uno de directiva) para llamar a la función show
en este controlador. Y cuando hago eso, también me gustaría que mi función de enlace detectara que algunas propiedades cambiaron y realizara algunas animaciones.
Aquí hay un código para ejemplificar lo que estoy pidiendo:
var app = angular.module('app', ['RestService']);
app.controller('IndexController', function($scope, RestService) {
var result = RestService.query();
if(result.error) {
popdown.notify(error.message, 'error');
}
});
Por lo tanto, al llamar show
al popdown
controlador de la directiva, la función de enlace también debe activarse y realizar una animación. ¿Cómo podría lograr eso?
javascript
jquery
angularjs
angularjs-directive
user253530
fuente
fuente
popdown
directiva en la página? ¿Es solo en un lugar donde se supone que otros controladores tienen acceso a ella, o hay varias ventanas emergentes en diferentes lugares?popdown.show(...)
lugar de, ¿nopopdown.notify(...)
es así? De lo contrario, la función de notificación es algo confusa.popdown.notify
?.notifiy
método, quiero decirRespuestas:
Esta es una pregunta interesante, y comencé a pensar en cómo implementaría algo como esto.
Se me ocurrió este (violín) ;
Básicamente, en lugar de intentar llamar a una directiva desde un controlador, creé un módulo para albergar toda la lógica emergente:
Puse dos cosas en el módulo, una
factory
para la API que se puede inyectar en cualquier lugar y la otradirective
para definir el comportamiento del elemento emergente real:El habitante define un par de funciones
success
yerror
y realiza un seguimiento de un par de variables:La directiva hace que la API se inyecte en su controlador y observa la API en busca de cambios (estoy usando bootstrap css por conveniencia):
Luego defino un
app
módulo que depende dePopdown
:Y el HTML se ve así:
No estoy seguro de si es completamente ideal, pero parecía una forma razonable de configurar la comunicación con una directiva emergente global.
Nuevamente, como referencia, el violín .
fuente
success(msg)
al html, llamaríasucess(name, msg)
para seleccionar la directiva con el nombre correcto.También puede utilizar eventos para activar el Popdown.
Aquí hay un violín basado en la solución de satchmorun. Prescinde de PopdownAPI, y el controlador de nivel superior en lugar de
$broadcast
los eventos de 'éxito' y 'error' en la cadena de alcance:El módulo Popdown luego registra las funciones del controlador para estos eventos, por ejemplo:
Esto funciona, al menos, y me parece una solución bien desacoplada. Dejaré que otros intervengan si esto se considera una mala práctica por alguna razón.
fuente
También puede exponer el controlador de la directiva al ámbito principal, como hace
ngForm
con elname
atributo: http://docs.angularjs.org/api/ng.directive:ngFormAquí puede encontrar un ejemplo muy básico de cómo se podría lograr http://plnkr.co/edit/Ps8OXrfpnePFvvdFgYJf?p=preview
En este ejemplo, tengo un
myDirective
controlador dedicado con$clear
método (una especie de API pública muy simple para la directiva). Puedo publicar este controlador en el ámbito principal y usar llamar a este método fuera de la directiva.fuente
$scope.$parent[alias]
porque me huele a usar una api angular interna. Pero todavía no puedo encontrar una solución más elegante para las directivas no singleton. Otras variantes como la transmisión de eventos o definir un objeto vacío en el controlador principal para la directiva api huele aún más.Tengo una solución mucho mejor.
aquí está mi directiva, he inyectado una referencia de objeto en la directiva y la he extendido agregando la función de invocación en el código de la directiva.
Declarando la directiva en el HTML con un parámetro:
mi controlador:
fuente