2014-06-11 103 views
4

我正在嘗試向我的應用程序中的每個狀態添加一個解析器函數,以等待應用程序「啓動」過程完成。我有以下的代碼已經:角ui路由器動態地將解析函數添加到所有狀態

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: {} 
}); 

但如果決心對象未設置狀態不會阻止:

$stateProvider.state('dashboard', { 
    url: "/", 
    templateUrl: "dashboard.html", 
    controller: "DashboardCtrl", 
}); 

我寧願不要爲我的每個狀態添加一個空的resolve對象,因爲我可能會在我處於這個狀態時向它們添加SessionResolver.handle解析函數。

除非解析對象已經存在,否則爲何動態地將解析函數添加到狀態的任何想法都會失敗?

回答

2

我可能不完全瞭解你的問題的背景,但似乎你正在尋找的是一個抽象的狀態。你可以爲你的應用程序聲明一個基本的抽象狀態,所有其他狀態都是其子狀態,並將該決定添加到抽象狀態中。這樣,所有狀態都將「阻塞」,直到父解析塊完成。

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

您可以在這裏找到更多有關抽象狀態的文檔https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views#abstract-states

6

我已經解決了問題是這樣的:

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')); });