2013-08-07 57 views
13

我遇到了很多麻煩,我似乎無法在SO或Google上找到任何東西,這有助於我發現什麼我做錯了

<!DOCTYPE html> 
<html data-ng-app="testApp"> 
    <head> 
     <title></title> 
    </head> 
    <body> 
     <div data-ng-controller="myController"> 
     {{test}}<br/> 
     {{test2}}<br/> 
     {{test3}} 
     <ul> 
      <li data-ng-repeat="member in members">{{ member.firstname}}</li> 
     </ul> 
     </div> 
     <script type="text/javascript" src="angular.min.js"></script> 
     <script type="text/javascript"> 
     angular.module('testApp', ['memberFactory']); 

     angular.module('testApp',[]) 
     .factory('memberFactory', function($http){ 

      var obj = {}; 
      obj.data = "abcd"; 
      obj.getResponse = function(){ 
       var temp = {}; 
       $http.get('hello.php').success(function(data){ 
         alert(data); 
         temp =data; 

       }); 

       return "some return value"; 
      } 

      return obj 
     }); 

     function myController($scope, memberFactory){ 
      $scope.test= "testString"; 
      $scope.test2= memberFactory.data; 
      $scope.test3= memberFactory.getResponse(); 

     } 
     </script> 
    </body> 
</html> 

return "some return value";作品,但是當我嘗試返回溫度,其空。我試過不同的方式來使這個工作,但我似乎無法設置$http.get()函數內的臨時值

這可能是一些簡單的事情(或在我的一個愚蠢的錯誤/誤導的方法)。任何意見,將不勝感激

+0

您正在使用角度1.0.1,這將打破1.3 .. –

回答

24

使用延遲:

obj.getResponse = function(){     
    var temp = {}; 
    var defer = $q.defer(); 
    $http.get('hello.php').success(function(data){ 
      alert(data); 
      temp =data; 
      defer.resolve(data); 

    }); 
    return defer.promise; 
} 
+2

什麼是$ q?我沒有定義。這是另一個圖書館嗎? – jonnie

+2

它必須以'$ http'相同的方式注入。這是AngularJS承諾/推遲模式的實現。 –

+0

@CodeZilla ok,但現在它返回'{「promise」:{}}'而不是任何東西,所以我仍然無法訪問我的數據,任何想法? – jonnie

14

這裏發生的事情是爲$ http.get異步性質的結果,當您運行$ http.get它不會爲了跑。也就是說,它'分支'並與代碼的其餘部分一起運行。這是爲了適應服務器延遲。

這是一個糟糕的可視化。

.getResponse Called    Return Temp. 
|-------------------|--------------| 
        |---------------------------------| 
        $http.get ~Waiting for Server~ Temp assigned to data. 

你可以看到Temp是如何返回給它的值嗎?

謝天謝地,您可以使用Angular調用的承諾,這是一個變量,您可以從函數返回,稍後「解析」該變量。你實例化一個這樣的承諾。

var myPromise = $q.defer(); 

通過使用

myPromise.resolve(data); 

值賦給它然後,您可以在函數返回後這一承諾,以正常的方式。即。

return myPromise.promise 

當然,對於所有這些,你需要$ q庫,它包含在函數參數中。

+0

哎呀,在我發佈之前沒有看到Codezilla的回答,他們有正確的想法。儘管如此,我將會留下這個解釋。 –

+0

感謝您的解釋,不幸的是我現在只是得到'{「promise」:{}}' – jonnie

+0

非常抱歉!只是注意到我的代碼中有一個錯誤。你需要返回myPromise.promise(如實際承諾對象!)應該工作。抱歉讓你誤入歧途! –

0
//in $httpProvider.interceptors  
if (typeof response.data === 'string') { 
    return response; 
} 
else { 
    return response.data; 
} 
+0

你能解釋你到底在做什麼嗎?這將有助於理解。簡單地寫代碼而不是gonaa會給人以清晰的印象。 – UDID