2015-07-21 42 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回调函数进行格式化(如果指定);“ –