Javascript Angular ui路由器动态向所有状态添加解析函数

Javascript Angular ui路由器动态向所有状态添加解析函数,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我正在尝试向应用程序中的每个状态添加一个解析器函数,以便等待应用程序“启动”过程完成。我已经有了以下代码: angular.forEach($state.get(), function(state) { state.resolve = state.resolve || {}; state.resolve.session = function() { return SessionResolver.handle(state); } }); SessionResolver是一种服

我正在尝试向应用程序中的每个状态添加一个解析器函数,以便等待应用程序“启动”过程完成。我已经有了以下代码:

angular.forEach($state.get(), function(state) {
  state.resolve = state.resolve || {};
  state.resolve.session = function() {
    return SessionResolver.handle(state);
  }
});
SessionResolver是一种服务,
handle(state)
函数返回一个承诺,该承诺在引导过程完成后解析

除非在没有现有的
resolve
对象的情况下定义了一个状态,否则这种方法可以正常工作。例如,在SessionResolver.handle承诺解析之前,以下状态将被阻止:

$stateProvider.state('dashboard', {
  url: "/",
  templateUrl: "dashboard.html",
  controller: "DashboardCtrl",
  resolve: {}
});
但如果未设置resolve对象,则状态不会阻止:

$stateProvider.state('dashboard', {
  url: "/",
  templateUrl: "dashboard.html",
  controller: "DashboardCtrl",
});
我不希望在每个状态中都添加一个空的
resolve
对象,因为我还可以在执行时向它们添加SessionResolver.handle resolve函数


你知道为什么除非解析对象已经存在,否则动态地向状态添加解析函数会失败吗?

我可能不完全理解你所关心的问题的上下文,但你所寻找的似乎是一个抽象状态。您可以为应用程序声明一个所有其他状态都将是其子级的基本抽象状态,并将解析添加到该抽象状态中。这样,所有状态都将“阻塞”,直到父解析块完成

$stateProvider.state('parent', {
  abstract: true,
  template: '',
  resolve: {
    session: function() {
      return SessionResolver.handle(state);
    }
  }
}).state('parent.child1', {
  url: '/',
  template: 'dashboard.html',
  controller: 'DashboardController'
});

你可以在这里找到更多关于抽象状态的文档。

我用以下方法解决了这个问题:

angular.module('sample', ['ui.router']).config(function($stateProvider) {
   var $delegate = $stateProvider.state;

   $stateProvider.state = function(name, definition) {
      definition.resolve = angular.extend({}, definition.resolve, {
         myCustomResolve: function() { return true; }
      });

      return $delegate.apply(this, arguments);
   };
   $stateProvider.state('example', { url: 'example/' });

}).run(function($state) { console.log('have resolve?', $state.get('example')); });