0

我是Angular的新手,我一直在努力尝试调用一个在我的控制器中使用Restangular的工厂。这里是控制器:AngularJS:服务对象为空

'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> 

我在做什么错?先谢谢你。

回答

2

这个人是一个异步调用:

Restangular.one("users", id).get().then(function(data) { 
    return data; 
    }); 

,它什么都不返回其父功能。

您可以从父函数返回一个承诺,并在上面提到的then回调(而不是return data;)中解决它。

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


UPDATE

基于注释中的问题,这里是我的意思是不必返回一个对象:

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 
    } 
]); 

见简单的例子在这里:http://plnkr.co/edit/KGUqCVJqeEcD5d6m7sVw?p=preview

+0

我明白服务和工厂之间的区别,但即使我只是为WebApi制作简单的函数或属性并从控制器调用它,WebApi对象也是空的。这是为什么? – user3181113

+0

因为需要退货,所以让我给你看一个简单的例子来看看我的意思。 – Shomz

+1

啊,我现在明白了。谢谢。 – user3181113

0

您应该修改代码以使用承诺并返回承诺从那里看空代码

 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}); 
      } 
     ]); 
+0

控制台爆炸与错误和状态'TypeError:undefined不是一个函数',并指向'WebApi.getProfile()'函数在'UserCtrl'。我在控制台中记录了'WebApi'对象,它仍然显示'Object {}' – user3181113

+0

我们缺少工厂返回,因此我使用return编辑过,现在可以尝试 –

+0

我的代码与您的代码完全相同, 'TypeError:undefined不是函数,因为对象是空的。这太奇怪了,因为控制器知道工厂,仍然无法与之通信。我甚至放入了一个简单的函数,它返回''一个字符串“',它仍然不会出现在WebApi对象中。你有什么想法,为什么这是?它在某种程度上在我的依赖? – user3181113