2016-08-27 47 views
1

我想通过一个服务将对象分配给$ scope对象。但是,我得到一个错误,说该对象是未定义的。我正在进行异步调用来获取对象,下面我使用$ timeout服务来模拟相同的。我试过$ q.defer()并返回一个承诺,怀疑它是一个计时问题,并且还调用$ apply()来调用绑定,但似乎没有任何工作。以下是链接到plunker中的代码。请帮我解决这个问题。 http://plnkr.co/edit/wyF4Bx1a39IEWS3m8Loe?p=info

<!DOCTYPE html> 
<html ng-app="plunker"> 

<head> 
    <meta charset="utf-8" /> 
    <title>AngularJS Plunker</title> 
    <script> 
    document.write('<base href="' + document.location + '" />'); 
    </script> 
    <link rel="stylesheet" href="style.css" /> 
    <script data-require="[email protected]" src="https://code.angularjs.org/1.4.12/angular.js" data-semver="1.4.9"></script> 
    <script src="app.js"></script> 
</head> 

<body ng-controller="profctrl"> 
    <p>Hello {{usr}}!</p> 
</body> 

</html> 

var ub = angular.module('app', []); 
ub.controller('profctrl', ["$scope", "formsub", "$log", "$timeout", function($scope, formsub, $log, $timeout) { 
    $log.log("In Profile controller"); 
    $scope.msg = ""; 
    $scope.usr = {}; 

    var fbresponse = { 
    name: 'xyz', 
    email: '[email protected]' 
    }; 

    $scope.usr = formsub.getprof(fbresponse); 
    $timeout(function() { 
    $log.log('$scope.usr', $scope.usr); 
    }, 2000); 
}]); 

ub.service('formsub', ["$http", "$log", "$q", "$timeout", function($http, $log, $q, $timeout) { 
    var user = {}; 
    var self = this; 

    self.msg = ""; 


    self.getprof = function(user) { 

     $timeout(function() { 
     $log.log('user assigned'); 
     return user; 
     }, 2000); 

    } //getprof 

}]); 
+1

的可能的复制[我如何返回a的回复同步调用?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

+0

它确定..解决了吗? –

回答

1
var ub = angular.module('myApp', []); 
ub.controller('profctrl', ["$scope", "formsub", "$log", "$timeout", function($scope, formsub, $log, $timeout) { 
$log.log("In Profile controller"); 
$scope.msg = ""; 
$scope.usr = {}; 

var fbresponse = { 
name: 'xyz', 
email: '[email protected]' 
}; 
formsub.getprof(fbresponse).then(function(result) { 
$scope.usr = result; 
alert(JSON.stringfy(result)); 
}); 

}]); 

ub.service('formsub', ["$http", "$log", "$q", "$timeout", function($http, $log, $q, $timeout) { 
var user = {}; 
var self = this; 
self.msg = ""; 
self.getprof = function(user) { 
    var deferral = $q.defer(); 
    $timeout(function() { 
    $log.log('user assigned'); 
    deferral.resolve(user); 
    }, 2000); 
    return deferral.promise; 
} //getprof 
}]); 

Demo

我使用$齐认为这将有助于你

+0

谢谢东条。这有帮助!我早些时候尝试过,但如下所示。这就是为什么我有一个问题。 $ scope.usr = formsub.getprof(fbresponse).then() –

1

模块名称是应用,而plunkr在HTML NG-应用

+0

谢谢Ciril。对这次错过抱歉,但那不是我的问题。 –

1

首先,你给了错误的模块的名称,应该是ng-app="app"。现在,如果您使用$q它将正常工作。这里是plunkr

+0

谢谢Kunal。这有帮助!我早些时候尝试过,但如下所示。这就是为什么我有一个问题。 $ scope.usr = formsub.getprof(fbresponse).then() –

+0

@RajkumarKaliyaperumal你究竟想要实现什么?你能简单澄清一下吗? –

0

由于ajax调用是异步的,您应该使用promise从$ http获取数据。你可以使用$ q或返回$ http本身,这是一个defferred对象。

服务:

self.getprof = function(user) { 
    var deff = $q.defer(); 
    //could be get/post/put... 
    $http.post(your_api_url, user). 
    then(
      function(data){ deff.resolve(data); }, 
      function(ex) { deff.reject(ex); } 
     ); 
     deff.promise; 

    } 

并在控制器:

formsub.getprof(user). 
    then(
      function(data){ 
       // success call back 
       $scope.usr = data; 
      }, 
      function(ex) { // error call back. Handle error here} 
     ); 
+0

谢谢。这有帮助!我早些时候尝试过,但如下所示。这就是为什么我有一个问题。 $ scope.usr = formsub.getprof(fbresponse).then() –

+0

@Rajkumar - 很高兴我帮了忙。干杯。 – Developer