2014-04-30 27 views
1

使用UI-Router,但我不確定是否重要。使用Angular工廠進行路由解析

我想要做的是將我當前的解析邏輯提取到工廠/服務中,以免污染我的$stateProvider定義。這是一個簡單的例子:

這裏是我當前的配置:($kinvey是返回一個承諾服務)

.state('home', { 
    url: '/', 
    views: { 
    'header': headerView, 
    'content': { 
     templateUrl: 'views/main.html', 
     controller: 'MainCtrl', 
    }, 
    'footer': footerView 
    }, 
    resolve: { 
    user: ['$kinvey', function ($kinvey) { 
     return $kinvey.User.me(); 
    }] 
    } 
}) 

而且想什麼我它是:

resolve: { 
    'user': 'DataResolverService.userResolve' 
    } 

DataResolverService

.factory('DataResolverService', function DataResolverService($kinvey) { 

    var userResolve = { 
    user: ['$kinvey', function ($kinvey) { 
     return $kinvey.User.me(); 
    }] 
    }; 

    // public API 
    return { 
    userResolve: userResolve 
    }; 

}); 

我似乎得到Unknown provider: DataResolverService.userResolveProvider <- DataResolverService.userResolve。這是因爲config()區塊內的工廠/服務不能像這樣運行嗎?

回答

3

這是因爲您正在配置塊中使用服務。你應該能夠這樣注入它:

resolve: { 
    'user': ['DataResolverService', function(DataResolverService){ 
     return DataResolverService.userResolve; 
    }] 
} 

另一種方法是隱藏在一個恆定的注射亂(不要忘了包括$injector作爲依賴):

resolve: $injector.get('ResolveMap') 

app.constant('ResolveMap',{ 
    'user': ['DataResolverService', function(DataResolverService){ 
     return DataResolverService.userResolve; 
    }] 
}); 

這裏有一個討論:https://groups.google.com/forum/#!topic/angular/QtO8QoxSjYw

+0

作爲一個「最佳實踐」的筆記,是否有更好的方法來做到這一點?看起來有點醜 - 但另一種情況更糟。 – dmackerman

+0

剛剛添加了一個可以隱藏常量中的「醜陋」的替代方法 –