如何在 $stateProvider 的 "resolve" 中使用工厂?
How can I use a factory inside a "resolve" of $stateProvider?
作为标题,我想使用一个工厂 insisde "resolve"
app.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
}
routers.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",我不知道如何在这部分代码中注入那个工厂。
我尝试将其放入该视图的主控制器中,但效果不佳。
(如果您将解决方案放在您的视图中,它应该可以工作。
如果您需要在同一状态的多个视图中进行解析。我会尝试使用抽象状态并在那里添加解析。)有效但不需要(见下面的编辑。)
请查看此 jsfiddle 或下面的演示。
我对演示进行了一些缩减以使内容更易于阅读。也没有在演示中为 DI 添加数组表示法。
您不需要在工厂中使用延迟对象,因为 $http
已经返回一个承诺。
编辑:
您可以将解决方案放在视图之外,它也应该可以工作。我已经在这个 fiddle 中尝试过了。
所以您的代码中可能存在其他问题。
好的,我认为您的代码的问题在于您没有从承诺中返回已解析的值。像 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>
angular.module('demoApp', ['ui.router'])
.factory('AbcService', function ($resource) {
return $resource('app/rest/abc', {}, {
'query': { method: 'GET', isArray: true}
});
})
.config(function ($stateProvider) {
$stateProvider
.state('abc', {
templateUrl: "scripts/abc.html",
url: "^/abc",
controller: 'abcController',
resolve: {
resolvedData: ['AbcService', function(AbcService) {
return AbcService.query();
}]
}
})
})
.controller('abcController', function ($scope, resolvedData) {
$scope.data = resolvedData;
});
作为标题,我想使用一个工厂 insisde "resolve" app.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
}
routers.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",我不知道如何在这部分代码中注入那个工厂。 我尝试将其放入该视图的主控制器中,但效果不佳。
(如果您将解决方案放在您的视图中,它应该可以工作。 如果您需要在同一状态的多个视图中进行解析。我会尝试使用抽象状态并在那里添加解析。)有效但不需要(见下面的编辑。)
请查看此 jsfiddle 或下面的演示。
我对演示进行了一些缩减以使内容更易于阅读。也没有在演示中为 DI 添加数组表示法。
您不需要在工厂中使用延迟对象,因为 $http
已经返回一个承诺。
编辑: 您可以将解决方案放在视图之外,它也应该可以工作。我已经在这个 fiddle 中尝试过了。 所以您的代码中可能存在其他问题。
好的,我认为您的代码的问题在于您没有从承诺中返回已解析的值。像 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>
angular.module('demoApp', ['ui.router'])
.factory('AbcService', function ($resource) {
return $resource('app/rest/abc', {}, {
'query': { method: 'GET', isArray: true}
});
})
.config(function ($stateProvider) {
$stateProvider
.state('abc', {
templateUrl: "scripts/abc.html",
url: "^/abc",
controller: 'abcController',
resolve: {
resolvedData: ['AbcService', function(AbcService) {
return AbcService.query();
}]
}
})
})
.controller('abcController', function ($scope, resolvedData) {
$scope.data = resolvedData;
});