ng-class 状态改变时不应用

ng-class not applied when state change occurs

我有一个指令根据 window 大小在元素上应用一些 类:

angular.module( 'myApp' ).directive('resizer', ['$window', function ($window) {
    return {
        link: function (scope, elem, attrs) {      
            angular.element($window).on('load resize', function () {
                scope.$apply(function(){
                    scope.isSmall = $window.innerWidth < 800 ? true : false;
                });
            });
            angular.element($window).on('$stateChangeStart', function () {
                scope.$apply(function(){
                    scope.isSmall = $window.innerWidth < 800 ? true : false;
                });
            });
        }
    };
}]);

基本上它设置:isSmall 为 true 或 false 基于 window 宽度。然后我的 ng-click 使用这个值来应用我的 类 像这样:

<div resizer ng-class="{ 'class1 class2 class': isSmall }"></div>

一切正常,但我注意到,如果我的应用程序中的状态更改为导航回应用了此指令的页面,则样式不会应用于该元素。任何人都知道我将如何解决这个问题?我的印象是我添加了错误的事件处理程序;我尝试将 $stateChangeStart 添加到 .on 调用中,但到目前为止还无法使其正常工作

尝试将指令范围设置为 true

return {
  restrict: 'A',
  scope: false,
  link: function (scope, elem, attrs) {      
    angular.element($window).on('load resize', function () {
      scope.$apply(function(){
        scope.isSmall = $window.innerWidth < 800 ? true : false;
      });
    });
  }
};

因此父级的范围将发生变化,相关元素将收到变化。

祝你好运!希望这有帮助:)

参考:http://www.undefinednull.com/2014/02/11/mastering-the-scope-of-a-directive-in-angularjs/

您可能可以使用 css 媒体查询来完成您需要的工作。

您面临的问题是在路由更改期间没有调整大小或加载事件,因此只需在指令触发时初始化 scope.isSmall,而不仅仅是在事件处理程序中

angular.module('myApp').directive('resizer', ['$window', function ($window) {

    return {
        restrict: 'A',
        link: function (scope, elem, attrs) {
            function setIsSmall() {
                scope.isSmall = $window.innerWidth < 800 ? true : false;
            }
            // when directive fires
            setIsSmall();

            angular.element($window).on('load resize', function () {
                scope.$apply(setIsSmall);
            });
        }
    };
}]);

注意:也可以考虑在范围销毁期间删除此处理程序,以避免一遍又一遍地添加它。这可能会对应用程序的其他部分产生影响,但是如果设置了任何其他侦听器

  scope.$on('$destroy', function(){
     $window.off('load resize');
   });