У меня есть директива, у которой есть собственный контроллер. См. Код ниже:
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'
}
});
Это должна быть система уведомлений об ошибках / уведомлениях / предупреждениях. Я хочу, чтобы другой контроллер (не директивный) вызвал функцию show
на этом контроллере. И когда я это сделаю, я бы также хотел, чтобы моя функция ссылки обнаруживала изменение некоторых свойств и выполняла некоторые анимации.
Вот код, иллюстрирующий то, о чем я прошу:
var app = angular.module('app', ['RestService']);
app.controller('IndexController', function($scope, RestService) {
var result = RestService.query();
if(result.error) {
popdown.notify(error.message, 'error');
}
});
Поэтому при вызове show
на popdown
директивы управления, функция ссылка должна также быть запущен и выполнить анимацию. Как я мог этого добиться?
javascript
jquery
angularjs
angularjs-directive
user253530
источник
источник
popdown
директивы на странице - только в одном месте, где все остальные контроллеры должны иметь к нему доступ, или есть несколько всплывающих окон в разных местах?popdown.show(...)
вместоpopdown.notify(...)
этого, верно? В противном случае функция уведомления может сбивать с толку.popdown.notify
?.notifiy
метод, я имею в видуОтветы:
Это интересный вопрос, и я начал думать, как бы реализовать что-то подобное.
Я придумал это (скрипка) ;
По сути, вместо того, чтобы пытаться вызвать директиву из контроллера, я создал модуль для размещения всей логики всплывающих окон:
Я поместил в модуль две вещи: a
factory
для API, который можно внедрить где угодно, и adirective
для определения поведения фактического всплывающего элемента:Фабрика просто определяет пару функций
success
иerror
отслеживает пару переменных:Директива вводит API в свой контроллер и отслеживает изменения API (для удобства я использую bootstrap css):
Затем я определяю
app
модуль, который зависит отPopdown
:А HTML выглядит так:
Я не уверен, что это полностью идеально, но это казалось разумным способом настроить связь с помощью глобальной директивы popdown.
Опять же для справки скрипка .
источник
success(msg)
html вы должны позвонить,sucess(name, msg)
чтобы выбрать директиву с правильным именем.Вы также можете использовать события для запуска всплывающего окна.
Вот скрипка, основанная на решении satchmorun. Он обходится без PopdownAPI, а контроллер верхнего уровня вместо
$broadcast
событий 'success' и 'error' в цепочке областей видимости:Затем модуль Popdown регистрирует функции-обработчики для этих событий, например:
По крайней мере, это работает и кажется мне хорошо развязанным решением. Я позволю другим вмешиваться, если это по какой-то причине считается плохой практикой.
источник
Вы также можете предоставить контроллер директивы родительской области, как это делает
ngForm
сname
атрибутом: http://docs.angularjs.org/api/ng.directive:ngFormЗдесь вы можете найти очень простой пример того, как этого можно достичь http://plnkr.co/edit/Ps8OXrfpnePFvvdFgYJf?p=preview
В этом примере у меня есть
myDirective
выделенный контроллер с$clear
методом (вроде очень простого публичного API для директивы). Я могу опубликовать этот контроллер в родительской области и использовать вызов этого метода вне директивы.источник
$scope.$parent[alias]
потому что для меня это пахнет внутренним angular api. Но до сих пор не могу найти более элегантного решения для не-одноэлементных директив. Другие варианты, такие как трансляция событий или определение пустого объекта в родительском контроллере для директивы api, пахнут еще больше.У меня есть гораздо лучшее решение.
вот моя директива, я ввел ссылку на объект в директиве и расширил ее, добавив функцию вызова в код директивы.
Объявление директивы в HTML с параметром:
мой контроллер:
источник