angularjs - 如何在 $stateProvider 的 "resolve"中使用工厂?

标签 angularjs angularjs-routing

作为标题,我想使用一个工厂 insisde 一个“解决” 应用程序.js:

    angular
    .module("goHenry", ["ui.router"])
    .factory("httpPost", httpPost)
    .controller("MainCTRL", ["$scope", MainCTRL]);

function MainCTRL($scope, httpPost){
    this.nameApp = "CiaoMiao";
    console.log($scope.children, httpPost);
}

function httpPost($http, $q){
    return {
        get: function() {
             var deferred = $q.defer();
             $http.post.apply(null, arguments)
                       .success(deferred.resolve)
                       .error(deferred.resolve);
         return deferred.promise;
        }
    }//RETURN
}

路由器.js:

    var httpConfig = {headers:{ "Content-Type" : "application/x-www-form-urlencoded" }};

    var config = ["$urlRouterProvider", "$stateProvider", function($urlRouterProvider, $stateProvider){

        $urlRouterProvider.otherwise("/");

        $stateProvider
            .state("multi",{
                url: "/multi",
                    "viewA@multi": {
                        templateUrl: "app/templates/login.htm",
                        controller: ["$scope", "getChildrenNumber", function($scope, getChildrenNumber){
                            this.nameApp = "nameAppChanged";
                            this.gatto = "Miao";
                        }],
                        controllerAs: "ctrl"
                    }
                },
                resolve: {
                    getChildrenNumber: ["$http", function($http, httpPost){
                        var httpP = httpPost.get("http://domain.com/user/login/api-login", $.param({ username:"ciaociao6@ciao.com", password:"ciaociA0" }), httpConfig)
                        console.log(httpP);
                        return "Some response from an API";
                    }]
                }
            });
angular
    .module("CiaoMiao")
    .config(config);

作为 console.log 的结果,我得到了“undefined”,我不知道如何在这部分代码中注入(inject)那个工厂。 我尝试将其放入该 View 的主 Controller 中,但效果不佳。

最佳答案

(如果您将解决方案放在您的 View 中,它应该可以工作。 如果您需要在同一状态的多个 View 中进行解析。我会尝试使用抽象状态并在那里添加解析。)有效但不需要(见下面的编辑。)

请看这个jsfiddle或下面的演示。

为了让内容更易于阅读,我对演示进行了一些缩减。也没有在演示中为 DI 添加数组表示法。 您不需要在工厂中使用延迟对象,因为 $http 已经返回了一个 promise 。

编辑: 您可以将解决方案放在 View 之外,它也应该可以工作。我已经在这个 fiddle 中试过了. 因此,您的代码中可能存在其他问题。

好的,我认为您的代码的问题在于您没有从 promise 中返回已解析的值。类似于 promise.then(function(response) {return response;});

angular.module('demoApp', ['ui.router'])
    .factory('myDataFactory', function ($http) {
    return {
        get: function (id) {
            return $http.post('http://crossorigin.me/http://www.mocky.io/v2/55a65562b2016ce10c7e6ea9', {
                id: id
            }).then(function (response) {
                return response;
            });
        }
    };
})
    .config(function ($urlRouterProvider, $stateProvider) {
    $urlRouterProvider.otherwise('/124');

    $stateProvider.state('home', {
        url: '/:id',
        views: {
            'viewA': {
                template: '{{hello}}',
                controller: 'homeController',
                resolve: {
                    backendData: function (myDataFactory, $stateParams) {
                        return myDataFactory.get($stateParams.id);
                    }
                }
            },
            '@': {
                template: 'main view'
            }
        }

    });
})
    .controller('homeController', function ($scope, backendData) {
    console.log(backendData);
    $scope.hello = backendData;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.2/angular.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.js"></script>
<div ng-app="demoApp">
    <div ui-view=""></div>
    <div ui-view="viewA"></div>
</div>

关于angularjs - 如何在 $stateProvider 的 "resolve"中使用工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31430231/

相关文章:

angularjs - ui-router 为什么父状态必须是抽象的

javascript - 警告 : Tried to load angular more than once

javascript - 单击时父元素的 AngularUI 弹出框样式发生变化

javascript - 简单的 AngularJS 程序在浏览器中为空白

angularjs - 当路由配置(Angular)中的 promise 被拒绝时,如何重定向到 404?

javascript - 部分中的 Angular 路由定义而不是 app.js

javascript - 在 Angular1 中使用 $routeProvider 时如何正确跨页面加载 javascript

javascript - 传单第一次不加载网址

angularjs - 使用 angularjs 的地理编码服务

javascript - AngularJS:带有 HTML 和 Angular 表达式的指令, "compile"具有外部范围的内容