Obecnie rozwijam slide menu directive dla AngularJS. Javascript składa się z trzech rodzajów dyrektyw: dyrektyw dla każdego rodzaju menu przesuwanego (dla jasności, uwzględniłem tylko lewe menu przesuwne), jedną dyrektywę opakowania dla reszty ekranu, asmWrapper i jedną dyrektywę przycisku sterowania, asmControl. Obecnie wszystkie te dyrektywy używają do komunikacji usługi asmService.Ng-klasa nie uruchomi się na niestandardowej dyrektywie
Gdy użytkownik kliknie na asmControl, kontroler tej dyrektywy wywołuje metodę asmService, która określa, które menu zostało wyzwolone i emituje "asmEvent" w $ rootScope. Sterownik asmSlidingMenu wychwyci to zdarzenie i zaktualizuje zmienną aktywną w swoim zasięgu, ale klasa elementu CSS elementu DOM pozostanie niezmieniona.
Zakładam, że ng-klasa nie jest ustawiona. Jak to naprawić?
Dołączyłem kod dyrektywy asmSlidingMenu poniżej. Aby zobaczyć pełniejszy przykład, przejrzyj zrobiony Plunker.
slideMenu.directive('asmSlideLeft', ['$rootScope', 'asmService',
function($rootScope, asmService) {
return {
restrict: 'AEC'
, scope: {}
, controller: function($scope) {
$rootScope.$on('asmEvent', function(event, prop) {
console.log('Intercepted: ' + asmService.asmStates.slideLeft.active);
$scope.active = asmService.asmStates.slideLeft.active;
});
}
, compile: function(element, attrs) {
attrs.$set('class', 'asm asm-horizontal asm-left');
attrs.$set('data-ng-class', '{"asm-left-open: active"}');
return {
pre: function preLink(scope, iElement, iAttrs) {}
, post: function postLink(scope, iElement, iAttrs) {}
}
}
}
}]);
Dziękuję bardzo! To działało idealnie. – Elzair
Co zrobić, jeśli element, który ma klasę ng, istnieje poza elementem dyrektywy? Oczywiście możesz to zrobić: angular.element (document.getElementById ('id')). AddClass ('someclass'), ale cały pomysł polega na dwukierunkowym powiązaniu danych z kątem. O wiele ładniej jest mieć nazwę klasy w widoku - na samym elemencie HTML. Bardziej czytelny. – Skychan
@Skychan O co ci chodzi? – zeroflagL