2015-07-21 70 views
0

我有以下功能getvalue。它與控制器一起位於AngularJS模塊內部。我想請點擊事件在控制器中調用另一個函數此功能(我希望我清楚)

功能:

function getvalue(Data, $http) { 
      var value=undefined; 
      $http({ 
       url: /myurl, 
       method: "GET", 
       params: { 
        tmp: Data.tmp, 
        pressure: Data.pressure    
       } 
      }).success(function (data, status, headers, config) {    
       value=parseFloat( console.log(data));//console working here 
       return value; 
      }); 
     return value; 
     } 

代碼裏面控制器

value= getvalue(formData, $http); 
     alert(value);//undefined here. Seems like value is never changed. 

我沒有獲得警報值,但控制檯正在打印此值。如有可能,我需要幫助解決兩個問題。

  1. 我該如何更改成功內的值並返回控制器?
  2. 有沒有,我沒有注入的$ HTTP從控制器的功能什麼辦法? -----如果我可以做單元測試,那會很好。
+2

您需要使用一個回調。你不能從異步通話中返回... – tymeJV

+0

@tymeJV哦好吧!任何參考? –

+0

刪除第二個'返回值;'。檢查後請 – Vineet

回答

1

,你會非常想拉$ http服務了控制器,使一家工廠做的那些電話。

在工廠

具有不接受你想要發送和有它返回的承諾回控制器

像這樣

回購

app.factory("fooRepo", ["$http", function($http){ 
    return { 
     getValue: function(data){ 
      return $http({ 
       method: "POST", 
       url: "/myUrl" 
      }); 
     } 
    }; 
}]); 

Serivce

數據的功能
app.factory("foo", ["$q", "fooRepo", function($q, fooRepo){ 
    return { 
     getValue: function(data){ 
      var deferred = $q.defer(); 

      fooRepo.getValue(data) 
      .success(function(results){ 
       //do some work 
       deferred.resolve(results); 
      }) 
      .error(function(error){ 
       // do some work 
       deferred.reject(error); 
      }); 

      return deferred.promise; 
     } 
    } 
}]); 

這裏是控制器

app.controller("fooCtrl", ["foo", function(foo){ 
    foo.getValue(dataHere) 
     .then(function(results){ 
      // do something here 
     }); 
}]); 

Added Plunkr

+0

爲什麼您創建了額外的promise ..它不應該是有 –

+1

讓控制器不得不做任何類型的邏輯,這實際上是我的存儲庫和服務的混合物。通過解決服務中的承諾,我可以對我需要的數據做任何類型的工作,然後向控制器回傳一個承諾 – Teliren

+0

@Teliren我再次有一個問題。在這種情況下,Angular抱怨說'foo.getValue不是函數的任何解決方案? –

1

當您調用一個正在進行異步調用的方法時,您必須從那裏返回承諾,因爲您不知道數據何時會從ajax返回。在該Ajax的成功,你應該更新你的變量。除了ajax函數之外,您將獲得未定義的值,因爲值以異步方式返回。

功能

function getvalue(Data) { 
     var value=undefined; 
     return $http({ 
      url: /myurl, 
      method: "GET", 
      params: { 
       tmp: Data.tmp, 
       pressure: Data.pressure    
      } 
     }) 
} 

控制器

getvalue(formData).success(function (data, status, headers, config) {    
     console.log(data);//you will get data here 
}); 
+0

你將如何注入$ http內功能? –

+0

如果你不打算將它注入到控制器的函數中,則表示'$ http未定義'。 –

+0

@DineshDevkota你應該在你的'controller' /'service'裏面加上'$ http',無論你使用這個'getvalue'方法.. –

0

一個$ http請求是異步。這意味着警報將在執行.success(..)回調之前被調用。

您可以在控制檯上看到結果,因爲它反映了在調用console.log()之後所做的更改。

調用alert(value);在.success()中 - 回調將屏蔽期望的結果。

-2

替換:

}).success(function (data, status, headers, config) {    
    value=parseFloat( console.log(data));//console working here 
    return value; 
}); 

有:

}).success(function (data, status, headers, config) {    
    alert(parseFloat(data)); 
}); 
+0

您應該閱讀異步調用的工作原理。 –

+0

閱讀問題!我要求將價值傳遞給控制器​​。我不想在那裏警惕! –

+0

〜Dinesh Devotka對不起,我的壞。 〜潘卡Parkar據我所知更迭被調用時,我們得到異步結果,同樣與.error 從jQuery.ajax(): 「成功 類型:Function(任何數據,字符串textStatus,jqXHR jqXHR) 的一種功能如果請求成功,則調用該函數。該函數傳遞三個參數:從服務器返回的數據,根據dataType參數或dataFilter回調函數進行格式化(如果指定);「 –