我有一个具有Translator.class.php
功能的工厂对象,如下所示
getProduct(id)
在我的控制器中,我想解决angular.module('app')
.factory('productFactory', ['$http', 'URL', function($http, URL){
var urlBase = URL.APISERVER;
//productFactory return object
var productFactory = {};
productFactory.getProducts = function(){
return $http.get(urlBase + '/products/');
}
productFactory.getProduct = function(id){
return $http.get(urlBase + '/products/' + id);
}
//return factory object
return productFactory;
}]);
承诺。我在另一个函数getProduct(id)
中解析了这个承诺,我传递了产品ID。
getProduct(id)
然而,当我在我的控制器中调用angular.module('portal')
.controller('ProductCtrl', ['$stateParams','productFactory',
function($stateParams, productFactory){
//Using 'controller as syntax' in view
var prod = this;
//Saves status of promise
prod.status;
//Get a single product
prod.product;
//Get the product id from stateParams and pass that to
//productFactory's getProduct(id) function
var id = $stateParams.id;
getProduct(id);//THIS IS WHAT CAUSES THE 500 ERROR
//Resolves promise
function getProduct(id){
productFactory.getProduct(id)
.success(function(product){
prod.product = product;
})
.error(function(error){
prod.status = 'Unable to load product data' + error.message;
});
}
}]);
时,我得到getProduct(id);
,那是因为当控制器编译时我还无法访问500 error
。
我有一份产品清单。当点击特定产品时,我被重定向到该单个产品的视图。到目前为止,它适用于$stateParams.id
。任何想法如何解决这个问题。我最初的想法是有条件地调用控制器中的500 error
。我相信有更好的方法可以做到这一点。
更新
以下是此状态的相关路由配置。
getProduct(id);
答案 0 :(得分:0)
我使用以下内容来解决使用ui-router的http请求。
$stateProvider
// nested list with custom controller
.state('home.list', {
url: '/list/:id',
templateUrl: 'partial-home-list.html',
resolve:{
// Inject services or factories here to fetch 'posts'
posts:function($http, $stateParams){
return $http.get('//jsonplaceholder.typicode.com/posts/' + ($stateParams.id || 1));
}
},
// resolved 'posts' get injected into controller
controller: function(posts, $scope){
$scope.posts = posts.data;
}
})
您可以像我一样依赖注入productFactory
而不是$http
。 posts
中指定的resolve
密钥可以依赖注入到指定为函数或字符串的控制器中。