Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS:服务对象为空_Javascript_Angularjs_Angularjs Service_Angularjs Controller - Fatal编程技术网

Javascript AngularJS:服务对象为空

Javascript AngularJS:服务对象为空,javascript,angularjs,angularjs-service,angularjs-controller,Javascript,Angularjs,Angularjs Service,Angularjs Controller,我是Angular的新手,一段时间以来我一直在努力给我的一个控制器中使用Restangular的工厂打电话。这是控制器: 'use strict'; angular.module('myApp') .controller('UserCtrl', ['WebApi', function($scope, WebApi) { $scope.user = WebApi.getProfile(1); } ]); 每当我在控制器中调用WebApi工厂时,WebApi对象都是空的。当我调用该

我是Angular的新手,一段时间以来我一直在努力给我的一个控制器中使用Restangular的工厂打电话。这是控制器:

'use strict';
angular.module('myApp')
  .controller('UserCtrl', ['WebApi', function($scope, WebApi) {
    $scope.user = WebApi.getProfile(1);
  }
]);
每当我在控制器中调用WebApi工厂时,WebApi对象都是空的。当我调用该方法时,它将返回undefined。当我在控制台中记录对象时,我得到

Object {}
这是我的工厂:

"use strict";
angular.module("myApp.services", ["restangular"])
  .factory("WebApi", ["Restangular", function(Restangular) {
    var getProfile;
    Restangular.withConfig(function(RestangularConfigurer) {
      RestangularConfigurer.setBaseUrl("http://127.0.0.1:3000/api/v1");
    });
    getProfile = function(id) {
      Restangular.one("users", id).get().then(function(data) {
        return data;
      });
    };
  }
]);
应用程序模块:

'use strict';
angular.module('myApp', ['ngCookies', 'ngSanitize', 'ui.router', 'myApp.services']);
它包含在我的索引html中:

    <script src="scripts/app.js"></script>
    <script src="scripts/controllers/main.js"></script>
    <script src="scripts/services/webapi.js"></script>
    <script src="scripts/controllers/user.js"></script>


我做错了什么?提前感谢。

您应该修改代码以使用promise并从中返回promise请参见伪代码

     angular.module("myApp.services", ["restangular"])
              .factory("WebApi", ["Restangular","$q", function(Restangular,$q) {

                Restangular.withConfig(function(RestangularConfigurer) {
                  RestangularConfigurer.setBaseUrl("http://127.0.0.1:3000/api/v1");
                });
                return {
                getProfile : function(id) {
                var deferred = $q.defer();
                  Restangular.one("users", id).get().then(function(data) {
                    deferred.resolve(data);
                  });
                  return deferred.promise;
                };
}

              }
            ]);

        'use strict';
        angular.module('myApp')
          .controller('UserCtrl', ['WebApi', function($scope, WebApi) {
             WebApi.getProfile(1).then(function(data){$scope.user=data});
          }
        ]);

这是一个异步调用:

Restangular.one("users", id).get().then(function(data) {
    return data;
  });
它不会将任何内容返回到其父函数

您可以从父函数返回承诺,并在我前面提到的
然后
回调中解析它(而不是
返回数据;

另一件事是,工厂需要返回一个对象,以使其属性可用。这里有一些非常好的答案:


更新

根据评论中的问题,以下是我必须返回对象的意思:

angular.module("myApp.services", ["restangular"])
  .factory("WebApi", ["Restangular", function(Restangular) {
    var getProfile;
    getProfile = function(id) {
        // this function is not visible from outside
    };
    // but if you do this:
    return {
        someValue: 3, // accessible via WebApi.someValue
        someFunction: function(){alert('me too')},
        getProfile: getProfile  // now it works as WebApi.getProfile(),
        etc: etc
    }
    // all of these above are now accessible
  }
]);

请参见此处的简单示例:

控制台出现错误并状态为
TypeError:undefined不是一个函数
,它指向
UserCtrl
中的
WebApi.getProfile()
函数。我在控制台中记录了
WebApi
对象,它仍然显示
object{}
我们缺少工厂返回,因此我使用返回进行了编辑。您现在可以尝试一下吗?我的代码与您的代码相同,但仍然得到
TypeError:undefined不是函数,因为该对象为空。这太奇怪了,因为控制器知道工厂的情况,但仍然无法与之通信。我甚至加入了一个简单的函数,返回
“字符串”
,但它仍然没有出现在
WebApi
对象中。你知道这是为什么吗?我理解服务和工厂之间的区别,但即使我只是为
WebApi
创建一个简单的函数或属性并从控制器调用它,
WebApi
对象也是空的。为什么会这样?因为它需要返回,让我给你们看一个简单的例子,看看我的意思。啊,我现在明白了。非常感谢。