将数据从服务返回到控制器
Returning data from Service to controller
一直在兜圈子,希望得到任何帮助。尝试将服务中的 api 中的数据提取到我的控制器中,并在 ng-repeat 中重复 returned 数据。
尝试过结果喜忧参半的方法。
方法一:
工厂
app.factory('getServiceData',function($http){
var getPosts = function(){
return $http.get("http://localhost:3000/posts")
.then(function(response){
console.log(response.data)
return response.data
})
}
控制器
app.controller('myCtrl',['getServiceData','$scope','$http',
function($scope,$http,getServiceData){
getServiceData.getPosts().then(function(data){
$scope.posts = data;
}).catch(function(){
$scope.error ='unable to get posts';
});
我的控制台 returns "Provider 'getServiceData' must return a value from $get factory method." 所以我的承诺不是 return 获取我可以使用的值,但不确定如何重构。
方法 2 在 ngRoutes 上使用 resolve 在用户导航到页面之前提取 api 数据
方法二:
app.factory('getServiceData',function($http){
return {
var getPosts = function(){
return $http.get("http://localhost:3000/posts")
.then(function(response){
console.log(response.data)
return response.data
})
}
};
配置:
.when('/home.html', {
templateUrl: 'app/home.html',
controller: 'myCtrl',
resolve: {
'ServiceData': function(getServiceData){
return getServiceData.getPosts();
}
}
})
第二种方法将 return 来自我的 api 的数据在 console.log 响应中,但我无法在我的控制器中显示它。
方法一应该是这样的:
控制器应该return getPosts 对象可以理解,因此错误 "Provider 'getServiceData' must return a value from $get factory method." 将得到解决。
app.factory('getServiceData',function($http) {
var getServiceDataFactory = {};
var _getPosts = function() {
return $http.get("http://localhost:3000/posts")
.then(function(response){
console.log(response.data);
return response.data;
});
}
getServiceDataFactory.getPosts = _getPosts;
return getServiceDataFactory;
});
您不需要在工厂中解决承诺,因为您正在控制器中重新解决它。只需 return 工厂中的 http 并在控制器中解析。
此外,return 工厂中的端点对象
app.factory('getServiceData',function($http){
var getPosts = function(){
return $http.get("http://localhost:3000/posts")
}
return {
getPosts : getPosts
}
})
应该是这样的
app.factory('getServiceData', function($http){
return {
getPosts : function() {
return $http.get("http://localhost:3000/posts")
}
};
});
重构方法 #1
第一个问题是您的 service
及其编码方式。
第二个问题是你的控制器依赖注入的顺序。
//Service
app.factory('getServiceData', getServiceData);
getServiceData.$inject = ['$http'];
function getServiceData($http) {
return {
getPosts: () => $http.get('http://localhost:3000/posts')
}
});
// Controller
app.controller('myCtr', myCtrl);
myCtrl.$inject = ['getServiceData', '$scope'];
function myCtrl(getServiceData,$scope) {
getServiceData.getPosts().then(function(data){
$scope.posts = data;
}).catch(function(){
$scope.error ='unable to get posts';
});
}
有用的参考资料:
一直在兜圈子,希望得到任何帮助。尝试将服务中的 api 中的数据提取到我的控制器中,并在 ng-repeat 中重复 returned 数据。
尝试过结果喜忧参半的方法。
方法一:
工厂
app.factory('getServiceData',function($http){
var getPosts = function(){
return $http.get("http://localhost:3000/posts")
.then(function(response){
console.log(response.data)
return response.data
})
}
控制器
app.controller('myCtrl',['getServiceData','$scope','$http',
function($scope,$http,getServiceData){
getServiceData.getPosts().then(function(data){
$scope.posts = data;
}).catch(function(){
$scope.error ='unable to get posts';
});
我的控制台 returns "Provider 'getServiceData' must return a value from $get factory method." 所以我的承诺不是 return 获取我可以使用的值,但不确定如何重构。
方法 2 在 ngRoutes 上使用 resolve 在用户导航到页面之前提取 api 数据
方法二:
app.factory('getServiceData',function($http){
return {
var getPosts = function(){
return $http.get("http://localhost:3000/posts")
.then(function(response){
console.log(response.data)
return response.data
})
}
};
配置:
.when('/home.html', {
templateUrl: 'app/home.html',
controller: 'myCtrl',
resolve: {
'ServiceData': function(getServiceData){
return getServiceData.getPosts();
}
}
})
第二种方法将 return 来自我的 api 的数据在 console.log 响应中,但我无法在我的控制器中显示它。
方法一应该是这样的:
控制器应该return getPosts 对象可以理解,因此错误 "Provider 'getServiceData' must return a value from $get factory method." 将得到解决。
app.factory('getServiceData',function($http) {
var getServiceDataFactory = {};
var _getPosts = function() {
return $http.get("http://localhost:3000/posts")
.then(function(response){
console.log(response.data);
return response.data;
});
}
getServiceDataFactory.getPosts = _getPosts;
return getServiceDataFactory;
});
您不需要在工厂中解决承诺,因为您正在控制器中重新解决它。只需 return 工厂中的 http 并在控制器中解析。
此外,return 工厂中的端点对象
app.factory('getServiceData',function($http){
var getPosts = function(){
return $http.get("http://localhost:3000/posts")
}
return {
getPosts : getPosts
}
})
应该是这样的
app.factory('getServiceData', function($http){
return {
getPosts : function() {
return $http.get("http://localhost:3000/posts")
}
};
});
重构方法 #1
第一个问题是您的 service
及其编码方式。
第二个问题是你的控制器依赖注入的顺序。
//Service
app.factory('getServiceData', getServiceData);
getServiceData.$inject = ['$http'];
function getServiceData($http) {
return {
getPosts: () => $http.get('http://localhost:3000/posts')
}
});
// Controller
app.controller('myCtr', myCtrl);
myCtrl.$inject = ['getServiceData', '$scope'];
function myCtrl(getServiceData,$scope) {
getServiceData.getPosts().then(function(data){
$scope.posts = data;
}).catch(function(){
$scope.error ='unable to get posts';
});
}
有用的参考资料: