Я на самом деле назвать директивные функции из контроллеров, как это:
function myControllerFunction = function() {
$scope.highlight();
}
highlight()
, будучи функцией в директиве.
Что делать, если у меня было две разные директивы, каждая из которых имеет свою собственную функцию highlight()
?
Есть ли способ получить фактическую директиву объект, вместо доступа к директивной функции непосредственно через $ scope?
Я предпочел бы быть четко о директиве я хочу использовать, например:
function myControllerFunction = function() {
$scope.myDirective.highlight();
}
Возможно ли это?
Если вы хотите знать, почему я хочу контроллер говорить с директивой, вот пример:
Мой контроллер получает булавку аутентификации от пользователя и отправляет его на службу. Служба возвращает значение true, если вывод действителен, иначе false.
В моей функции контроллера я проверяю логическое возвращаемое значение. Если это правда, я называю директивную функцию, называемую highlight, которая просто выделяет div в зеленом, если это правда, иначе я называю это, чтобы выделить его красным цветом.
Вот моя функция контроллера:
$scope.keypadEnter = function() {
userService.isCodeValid($scope.code).then(function (result)
{
if (JSON.parse(result.data)) {
$scope.highlight("lime").then(function() {
$scope.code = "";
$location.path('/clockin');
});
}
else
{
$scope.highlight("red").then(function() {
$scope.resetDisplay();
$scope.code = "";
});
}
});
};
А вот изюминка функция моей директивы:
...
link: function ($scope, $element, $attrs) {
$scope.highlight = function (color) {
var deferred = $q.defer();
$element.effect("highlight", { color: color }, 500);
$element.find("span").css('color', '#000')
.animate({ opacity: 0 }, 500, function() {
$element.find("span").css('opacity', 1).css('color', '#fff')
});
$timeout(deferred.resolve, 500);
return deferred.promise;
}
...
На основе ваших предложений, я изменил свою директиву код, чтобы наблюдать за переменную $scope.color
, например:
angular.module('clockin').directive('grDisplay', function ($q, $timeout) {
return {
restrict: 'A',
link: function ($scope, $element, $attrs) {
$attrs.observe('color', function (color) {
var deferred = $q.defer();
$element.effect("highlight", { color: color }, 500);
$element.find("span").css('color', '#000')
.animate({ opacity: 0 }, 500, function() {
$element.find("span").css('opacity', 1).css('color', '#fff')
});
$timeout(deferred.resolve, 500);
return deferred.promise;
});
}
}
});
И вот мой код просмотра:
<div data-gr-display ng-attr-color="{{ color }}" class="display"><span>{{code}}</span></div>
Но я получаю эту ошибку:
TypeError: object doesn't support this property or method « observe »
at link (http://localhost:18000/App/clockin/keypad/display-directive.js:6:13)
at nodeLinkFn (http://localhost:18000/Scripts/angular.js:6692:13)
...
Вместо того, чтобы вызывать явно функцию от контроллера, не будет он будет менее запутанным, определяя объект области явно в функции ссылок каждой директивы? то есть $ scope.highlightA = и т. д.? а затем вызов $ scope.highlightA или B? – alou
Это хорошая идея. Благодаря ! Единственное, так как я прочитал ответ Adlen ниже, я не уверен, что я делаю все правильно (вызывая директиву из метода контроллера). Есть ли лучший способ сделать эту работу? – 2014-09-03 14:00:44
Обычно это работа службы, вводя ее в контроллер и используя ее методы или объекты данных, но если это сработает для вас, я думаю, это нормально (это не проблема, пока не будет: P) – alou