【发布时间】:2016-02-09 00:18:57
【问题描述】:
我有一个具有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) 的承诺。我正在另一个函数getProduct(id) 中解决这个承诺,我在其中传递了产品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);。我确信有更好的方法来做到这一点。
更新
这里是这个状态的相关路由配置。
.state('products-view', {
url: '/products/:id',
templateUrl: '/core/products/view.html'
})
【问题讨论】:
-
显示该状态的路由配置。假设
id在 url 中,没有理由$stateParams不可用 -
@charlietfl 我已经更新了我的问题。
-
如果 url 中有一个有效的 id 应该一切正常。开发工具网络中用于请求本身的 url 是什么?它是否显示正确的 ID 或类似
undefined的东西?如果在浏览器窗口中打开 API 并在 url 中使用有效的 id,API 是否有效? -
@charlietfl 是的,链接中有一个有效的 url。该 url 用于从 perl 后端请求 json 文件(这是临时的,因为我们还没有此资源的 RESTful 端点)。
http请求返回 json 文档,但我仍然在 Chrome 开发工具控制台中收到500错误。
标签: angularjs angular-ui-router angular-promise angularjs-factory