【问题标题】:Wait for Provider to finish before entering State在进入状态之前等待提供者完成
【发布时间】:2015-03-31 21:18:05
【问题描述】:

我正在尝试等待提供程序完成初始化,然后 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 创建一个promise 并使用resolve 等待它,但是在module.config 级别$q 无法注入(或者我只是不知道如何注入?)。

我该如何解决这个问题?

【问题讨论】:

    标签: angularjs angular-ui-router angularjs-injector angularjs-provider


    【解决方案1】:

    $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

    【讨论】:

    • 不完全是我想要的,但让我走上了正轨。标记为最终答案,因为它比下面的更详细。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 2022-11-29
      • 2020-05-02
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      相关资源
      最近更新 更多