在进入 State 之前等待 Provider 完成
Wait for Provider to finish before entering State
我正在尝试等待提供程序完成初始化,然后 ui-router 继续加载状态。
每次进入该状态时,相机都应该启用,并且每当它再次被禁用时。我将其放入提供程序中,因为它需要在 module.config
级别可用:
.provider("Camera", function CameraProvider() {
function init() {
//async enableCamera
}
function exit() {
//disableCamera
}
function $get() {
return { init: init, exit: exit };
}
});
和状态:
var cam = DubCameraProvider.$get(); // this is a hack, but I don't know how to
$stateProvider
.state("CameraState", {
url: "/camera",
onEnter: cam.init,
onExit: cam.exit,
views: {
"view": {
// template: ...,
controller: "ControllerUsingCamera"
}
}
我尝试使用 $q
创建一个承诺并使用 resolve
等待它,但是在 module.config
级别 $q 无法注入(或者我只是不不知道怎么做?)。
我该如何解决这个问题?
resolve
自带依赖注入。你可以这样做:
$stateProvider.state("CameraState", {
url: "/camera",
onEnter: cam.init,
onExit: cam.exit,
views: {
"view": {
// template: ...,
controller: "ControllerUsingCamera"
}
},
resolve: {
somethingAsync: function($q) {
var promise = $q.all( /*bunch of promises*/ );
return promise;
}
}
}
$q
可以毫无问题地注入到你的状态的解析对象中:
配置:
angular.module('app').config([
'$stateProvider',
'$urlRouterProvider',
function ($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/');
$stateProvider.state('root', {
'url': '/',
'controller': 'rootController',
'templateUrl': 'root.html',
'resolve': {
'data': [
'$q',
'$timeout',
function ($q, $timeout) {
var deferred = $q.defer();
$timeout(function() {
deferred.resolve({
'value': 'Foo'
});
}, 5000);
return deferred.promise;
}
]
}
});
}
]);
控制器:
angular.module('app').controller('rootController', [
'$scope',
'data',
function ($scope, data) {
$scope.value = data.value;
}
]);
直接来自他们 wiki 上的文档:https://github.com/angular-ui/ui-router/wiki#resolve
这是一个关于 Plunker 的工作示例:http://plnkr.co/edit/kJ99Hi0qWx7DJxOVzxgA?p=preview
我正在尝试等待提供程序完成初始化,然后 ui-router 继续加载状态。
每次进入该状态时,相机都应该启用,并且每当它再次被禁用时。我将其放入提供程序中,因为它需要在 module.config
级别可用:
.provider("Camera", function CameraProvider() {
function init() {
//async enableCamera
}
function exit() {
//disableCamera
}
function $get() {
return { init: init, exit: exit };
}
});
和状态:
var cam = DubCameraProvider.$get(); // this is a hack, but I don't know how to
$stateProvider
.state("CameraState", {
url: "/camera",
onEnter: cam.init,
onExit: cam.exit,
views: {
"view": {
// template: ...,
controller: "ControllerUsingCamera"
}
}
我尝试使用 $q
创建一个承诺并使用 resolve
等待它,但是在 module.config
级别 $q 无法注入(或者我只是不不知道怎么做?)。
我该如何解决这个问题?
resolve
自带依赖注入。你可以这样做:
$stateProvider.state("CameraState", {
url: "/camera",
onEnter: cam.init,
onExit: cam.exit,
views: {
"view": {
// template: ...,
controller: "ControllerUsingCamera"
}
},
resolve: {
somethingAsync: function($q) {
var promise = $q.all( /*bunch of promises*/ );
return promise;
}
}
}
$q
可以毫无问题地注入到你的状态的解析对象中:
配置:
angular.module('app').config([
'$stateProvider',
'$urlRouterProvider',
function ($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/');
$stateProvider.state('root', {
'url': '/',
'controller': 'rootController',
'templateUrl': 'root.html',
'resolve': {
'data': [
'$q',
'$timeout',
function ($q, $timeout) {
var deferred = $q.defer();
$timeout(function() {
deferred.resolve({
'value': 'Foo'
});
}, 5000);
return deferred.promise;
}
]
}
});
}
]);
控制器:
angular.module('app').controller('rootController', [
'$scope',
'data',
function ($scope, data) {
$scope.value = data.value;
}
]);
直接来自他们 wiki 上的文档:https://github.com/angular-ui/ui-router/wiki#resolve
这是一个关于 Plunker 的工作示例:http://plnkr.co/edit/kJ99Hi0qWx7DJxOVzxgA?p=preview