解决Factory函数返回的AngularJS保证

时间:2016-02-09 00:18:58

标签: angularjs angular-ui-router angular-promise angularjs-factory

我有一个具有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);

1 个答案:

答案 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而不是$httpposts中指定的resolve密钥可以依赖注入到指定为函数或字符串的控制器中。