angularjs - 如何在 Angular JS 中轻松实现多种布局?

标签 angularjs angularjs-directive angularjs-routing

我需要能够为不同的路线指定不同的布局,最理想的是我希望能够在路线配置中的对象中定义布局和其他参数,并让它们在路线更改时传播。

最佳答案

这是我在当前项目中解决该问题的方法。

可找到工作演示 here


如果您可以像这样在 $routeProvider.when(...) block 中定义对象会怎样:

路线定义:

  $routeProvider

    .when('/', {
      templateUrl: 'main.html',
      controller: 'MainCtrl',
      resolve: {
        interceptor: interceptWith('routeChangeInterceptor', {

          stateClass: {
            fullWidthLayout: true
          }

        })
      }
    });


并让它们传播并使用它来使用像这样的 stateClass 对象添加具有 ng-class 接口(interface)的类?

HTML:

<body state-class="{'full-width-layout': fullWidthLayout}"> ... </body>

<div class="some-class" state-class="{'some-class': someValue}"> ... </div>



如何:

这是使用一个 interceptWith(...) 帮助器,它简单地注入(inject)一个服务并使用给定的参数调用它,但它也可以使用这样的数组表示法来实现

interceptor: ['serviceToInject', function(injectedService) { .. }];

只有这样才更干燥。有关更多信息,请参阅演示。


用于广播路由定义中的对象的服务:

//This interceptor is responsible for emiting an event on rootScope
  .factory('routeChangeInterceptor', ['$rootScope', function($rootScope) {

    var _prepare = function(state) {
      $rootScope.$broadcast('data:broadcast-state', state);  
    };

    return {
      prepare: _prepare
    };
  }]);


用于根据广播状态事件对象添加/删除类的指令如下所示:

//This directive receives and $parses object/classname mappings, 
//and it will add or remove the defined class for every mapping that is defined.

angular.module('broadcastState')
  .directive('stateClass', ['$parse', function ($parse) {

    var _linkFn = function link(scope, element, attrs) {

        scope.$on('data:broadcast-state', function(e, state) {

          //Set defaults
          state = state || {};
          state.stateClass = state.stateClass || {};

          var classes = $parse(attrs.stateClass)(state.stateClass);

          angular.forEach(classes,function(value,className) {
            if(value && typeof value === 'boolean')
            {
              element.addClass(className);
            }
            else
            {
              element.removeClass(className);
            }

          });

        });
    }

    return {
      restrict: 'A',
      link: _linkFn
    };
  }]);


查看plnkr阅读更多内容。

关于angularjs - 如何在 Angular JS 中轻松实现多种布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15795768/

相关文章:

javascript - Angularjs - ng-repeat 内的 ng-view

javascript - 如何使用ng-repeat循环遍历对象内的数组

AngularJS:初始化时获取指令中的插值属性值

javascript - 扩展 Angular yeoman 生成器

javascript - 根据对象值定义具有隔离范围的自定义指令

angularjs - 参数数量未知的 Angular 指令函数

javascript - Karma/Jasmine 测试自定义指令 Controller

php - AngularJS ngRoute 和 PHP $_SESSION 变量

javascript - 带有 Bootstrap 轮播问题的 Angular 路由

javascript - ng-change 后的 Angular 重置复选框