我目前正在为AngularJS开发slide menu directive。 javascript由三种类型的指令组成:每种类型的滑动菜单的指令(为了简洁起见,我只包括左侧滑动菜单),一个用于屏幕其余部分的包装指令, asmWrapper ,和一个控制按钮指令, asmControl 。目前,所有这些指令都使用服务 asmService 进行通信。
当用户点击asmControl时,该指令的控制器调用asmService上的一个方法,该方法确定触发了哪个菜单并发出了一个' asmEvent'在$ rootScope上。 asmSlidingMenu 的控制器将捕获该事件并更新其范围内的活动变量,但DOM元素的CSS类保持不变。
我认为没有设置 ng-class 。我该如何解决这个问题?
我在下面列出了asmSlidingMenu指令的代码。要查看更完整的示例,请查看我制作的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) {}
}
}
}
}]);
答案 0 :(得分:19)
首先,active
位于隔离范围内,因此ng-class
无法访问它。
其次,更重要的是,{<1}}在之后添加元素的指令已被angular收集。太晚了。
如果您有自己的指令,则没有理由使用ng-class
。
ng-class