【问题标题】:AngularJS Dependency injection in controller of routeProvider resolverouteProvider的控制器中的AngularJS依赖注入解析
【发布时间】:2016-02-04 16:37:30
【问题描述】:

注入应该注入控制器的resolve 的返回对象,但事实并非如此。我正在使用一个承诺,以便控制器在承诺解决之前不会实例化,因为我正在使用 $http 服务进行 HTTP POST。

我还使用$location.path 根据响应数据进行一些重定向。第一个路由将使用它获得的数据重定向到template1 路由。

$routeProvider
    .when("/auth/:id", amd.route(
    {   
        controller: 'eventController',
        controllerUrl: 'app/controllers/eventController',
        resolve: {
            returnedData: ['$http', '$location', '$route', '$q', function ($http, $location, $route, $q) {
                var id = $route.current.params.id;
                var defer = $q.defer();
                $http({
                    method: 'POST',
                    url: 'http://domain/service/webapi',
                    data: { 'name': id }
                }).then(function (response) {
                    var template = "/template".concat(response.data.displayLayout);
                    defer.resolve(response.data);
                    $location.path(template);
                    return defer.promise;
                });
            }]
        }
    }))
    .when("/template1", amd.route(
    {
        templateUrl: 'views/templates/template1.html',
        controller: 'eventController',
        controllerUrl: 'app/controllers/eventController',
    }));

app.controller('eventController', ['$scope', '$routeParams', '$timeout', 'returnedData',
    function ($scope, $routeParams, $timeout, returnedData) {
        // ...controller code here: $scope.returnedData = returnedData
});

我收到 AngularJS 错误:

错误:$injector:unpr 未知提供者

对此有什么想法吗?

【问题讨论】:

    标签: javascript angularjs ngroute


    【解决方案1】:

    在 AngularJS API 页面中,关于 routeProvider (https://docs.angularjs.org/api/ngRoute/provider/$routeProvider)

    你可以看到:

    resolve - {Object.=} ...如果这些依赖项中的任何一个是承诺,路由器将等待它们全部被解析或在控制器被实例化之前被拒绝

    你应该像下面这样编辑你的代码:

    var id = $route.current.params.id;
    var defer = $q.defer();
    $http({
        method: 'POST',
        url: 'http://domain/service/webapi',
        data: { 'name': id }
    }).then(function (response) {
        var template = "/template".concat(response.data.displayLayout);
        defer.resolve(response.data);
        $location.path(template);
    });
    // return the promise outside `then` method, then angularjs will wait it `resolve`
    return defer.promise;
    

    还有更多,请注意:

    请注意,ngRoute.$routeParams 仍将引用这些解析函数中的先前路由。改为使用 $route.current.params 来访问新的路由参数。

    【讨论】:

    • 太棒了!!现在returnData 对象被注入到我的控制器中,$location.path(template) 行被注释掉了。现在的问题是如何在 $routeProvider 中将解析结果从一个路径传递到下一个路径?
    • 如果你解析的数据比较复杂:可以使用Service来解决。因为Service在一个模块中是唯一的,所以它可以很容易地用来传输数据。定义一个服务并注入两个路径。如果很简单:可以直接使用$routeParams,然后把数据放到路径下。 Wish可以帮助你
    • 成功了!我直接在用于路由的模块中创建了一个服务,由于服务在 Angular 中是单例的,我可以稍后重用它来从中获取数据。
    • 为您的成功感到高兴~
    【解决方案2】:

    在 ng-route 中使用依赖注入, 我的解决方案:

    var myApp = angular.module("myApp", ["ngRoute", "localytics.directives"]);
    
    myApp.config(['$routeProvider',function ($routeProvider) {
    
        $routeProvider
            .when("/", {
                templateUrl: "//TimeLine.html",
                controller: "MainCtrl"
            })    
            .when("/AddOrEditOccasion", {
                templateUrl: "/Html/GiftWhiz/AddOrEditOccasion.html",
                controller: "AddOrEditOccasionCtrl"
            })
            .when("/OccasionStart", {
                templateUrl: "/OccasionStart.html",
                controller: "OccasionStartCtrl"
            })        
    }]);
    
    
    myApp.controller("MainCtrl", ['$scope', '$http', '$location', function ($scope, $http, $location) {
    
       //your codes
    
    }]);
    

    【讨论】:

    • 请解释这段代码的作用和放置位置。正如目前所写,这几乎不是一个答案.. 最好的问候
    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 2013-01-22
    • 2015-04-02
    • 1970-01-01
    • 2019-02-18
    • 2014-10-14
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多