Я пытаюсь создать директиву выпадающего списка, используя код Углового UI для вдохновения.
Я могу заставить его работать в том смысле, что он открывает и закрывает выпадающий список, но я попытался его расширить, чтобы служба «dropdownManager» могла закрыть все выпадающие списки на странице и открыть ее и закрывается с использованием кода контроллера страницы.
Для этого я создал атрибут под названием «is-open» и поставил на него угловые часы. К сожалению, эти часы не срабатывают, когда атрибут обновляется контроллером или когда переменная scope обновляется из собственных функций открытия/закрытия директивы. Я знаю, что значение меняется, потому что в противном случае выпадающее меню не будет открываться и закрываться, но часы определенно не вызывают, потому что внутри него есть console.log.
Странно, что он срабатывает один раз для каждого выпадающего списка на странице, когда он сначала инициализируется, потому что console.log записывается!
В любом случае, я стараюсь сделать скрипку, но слишком много зависимостей, извините, но мне удалось максимально уменьшить код, поэтому, надеюсь, для опытного пользователя Angular это должно быть очень легко понять.
angular.module('directives').directive('dropdown', function() {
return {
restrict: 'EA',
scope: {
isOpen: '=?',
},
link: function ($scope, $element, $attrs, ngModel) {
// Defaults
$scope.isOpen = false;
// Watch the isOpen variable
$scope.$watch('isOpen', function(value) {
console.log("Scope Changed", $scope.isOpen);
// Open or close this panel
if (value === true){
$scope.openDropdown();
}
else{
$scope.closeDropdown();
}
});
// Open Dropdown
$scope.openDropdown = function($event){
$scope.isOpen = true;
var panelEl = $element.find('[dropdown-panel]');
panelEl.slideDown(100, function(){
$element.addClass('is-open');
});
};
// Open Dropdown
$scope.closeDropdown = function($event){
$scope.isOpen = false;
var panelEl = $element.find('[dropdown-panel]');
$element.removeClass('is-open');
panelEl.slideUp(100);
};
// Toggle Dropdown
$scope.toggleDropdown = function ($event) {
if(!$scope.isOpen){
$scope.openDropdown();
}
else{
$scope.closeDropdown();
}
};
// Add click event to toggle element
$element.find('[dropdown-toggle]').bind('click', $scope.toggleDropdown);
}
};
});
Несомненно, все, что находится внутри самой директивы, не нуждается в «namespacing», потому что все это прямо на $ scope? Какой бит нужно использовать xxx.yyy? – jonhobbs
О, похоже, комментарий удален. – jonhobbs
Получилось долго, поэтому я перевел его на ответ. – 7stud