AngularJS:控制器中未定义的工厂函数

AngularJS : factory function undefined in controller

我曾经以完全相同的方式让它工作,这让我发疯。我想对工厂执行 $http GET 调用,然后将结果返回到控制器中进行处理。

factory(不要注意请求的疯狂url):

App.factory('MessageFactory', function ($http) {
        var MessageFactory = {
            getCast: function () {
                var request = {
                    method: "GET",
                    url: spHostUrl + "/_api/web/Lists/getByTitle('" + listTitle + "')/items?$select=AuthorId,Author/Name,Author/Title,Type_x0020_message,Title,Modified,Body,Expires,Attachments&$expand=Author/Id",
                    headers: {
                        "Content-Type": "application/json;odata=verbose",
                        "Accept": "application/json;odata=verbose"
                    }
                };

                $http(request)
                .then(function (res) {
                    return res.data;
                }).catch(function (res) {
                    console.error("error ", res.status, res.data);
                }).finally(function () {
                    console.log("end");
                });
            }
        };
        return MessageFactory;
    });

现在 控制器 :

App.controller('MessageController', function ($scope, $http, $log, $attrs, MessageFactory) {
        $scope.messages = MessageFactory;
        MessageFactory.getCast().then(function (asyncCastData) {
            $scope.messages.cast = asyncCastData;
        });
        $scope.$watch('messages.cast', function (cast) {
            //do stuff
        });
});

当我测试它时,出现以下错误:

Error: MessageFactory.getCast(...) is undefined @/Scripts/App.js:167:9

167行确实是controller中的这一行

MessageFactory.getCast().then(function (asyncCastData) {

我的应用程序在任何其他功能上都运行良好,所以我在添加这部分时出现了问题,我很确定我的控制器还不知道我的工厂,因此尝试访问他的功能。因为它是一个异步调用,所以它应该与控制器中的代码一起工作。我需要你的帮助,谢谢。

You must be getting .then of undefined error

因为您错过了 return 服务方法的承诺。

服务

var MessageFactory = {
  getCast: function() {
    var request = {
      method: "GET",
      url: spHostUrl + "/_api/web/Lists/getByTitle('" + listTitle + "')/items?$select=AuthorId,Author/Name,Author/Title,Type_x0020_message,Title,Modified,Body,Expires,Attachments&$expand=Author/Id",
      headers: {
        "Content-Type": "application/json;odata=verbose",
        "Accept": "application/json;odata=verbose"
      }
    };

    return $http(request) //returned promise from here
      .then(function(res) {
        return res.data;
      }).catch(function(res) {
        console.error("error ", res.status, res.data);
      }).finally(function() {
        console.log("end");
      });
    }
};