AngularJS:为什么我的控制器在我的服务电话中被“未定义”?

时间:2015-09-26 21:43:41

标签: javascript angularjs

问题:我的服务正在检索正确的信息,为什么我的控制器不能从我的服务中获取数据?

服务:这是我的控制器(以及最终其他东西)调用的代码。

// search.service.js
(function () {
    'use strict';

    angular.
        module('trips').
        factory('SearchService', SearchService);

    SearchService.$inject = ['BoatList'];

    function SearchService(BoatList) {
        var service = {
            getBoatList: getBoatList
        };

        return service;

        //////////////////////

        function getBoatList() {
            BoatList.query()
                .$promise
                .then(function (data) {
                    console.log(data);
                    return data;
                })
                .catch(function (error) {
                    return error;
                })
        }
    }
})();

控制台信息

这就是为什么我很困惑。该服务将Array[7]作为API调用中.then()的一部分记录到控制台。该数组包含我想要的数据。由于某种原因,我似乎无法在控制器中访问它。当我使用调试器运行它时,我得到'undefined'

控制器:当我在服务的getBoatList中调用相同的代码时,一切正常。当我尝试从activate()访问返回数据时,我没有收到任何错误,仅'undefined'

//search.controller.js
(function () {
    'use strict';

    angular.
        module('trips').
        controller('SearchController', SearchController);

    SearchController.$inject = ['$stateParams', 'SearchService'];

    function SearchController($stateParams, SearchService) {
        var vm = this;

        vm.boatList = null;

        activate();

        ////////////////////

        function activate() {
            vm.boatList = SearchService.getBoatList();
        }
    }
})();

回顾:我的服务获取正确的数据并将其记录到控制台。我的控制器没有通过调用服务获得相同的信息。我怎样才能解决这个问题,误解是什么导致了我这个问题呢?

1 个答案:

答案 0 :(得分:3)

您必须更改工厂中的方法,因为方法getBoatList应该返回一个承诺。

将您的工厂方法更改为:

function getBoatList() {
   return BoatList.query().$promise;
}

在控制器中,您必须将activate方法更改为:

function activate() {
   SearchService.getBoatList()
      .then(function (data) {
         vm.boatList = data;
      })
      .catch(function (error) {
         // do smth on error
      });
}