Angular没有立即发出$ http请求

时间:2013-06-11 08:51:29

标签: angularjs

我有一个指令响应从输入元素触发的Blur事件,然后最终导致调用Angular $ http服务以发出适当的HTTP请求。

正确调用$ http服务并生成预期的承诺,但实际的HTTP请求不会立即生成。它只会在进行其他类型的DOM交互后才会触发。

为什么不立即提出请求?我怎么能强迫他们立即制作呢?

Angular v1.1.5

3 个答案:

答案 0 :(得分:19)

原因

我最终在GitHub上发现了答案(https://github.com/angular/angular.js/issues/2442):

  

v1.1.4 ...改变了$ http的工作方式,以便在nextTick上安排,而不是立即触发。这意味着如果您的$ http是根据不会导致$ digest触发的内容安排的,那么您的请求将不会被发送。您可以通过点击页面几次(任何地方)来验证这是您所看到的行为,并且您应该看到您的请求已经结束。

解决方案

正如帖子建议我触发$ digest周期,这导致我的$ http生成的请求立即被触发。

scope.$apply();

答案 1 :(得分:2)

除了上面的其他原因...如果您从angular之外的代码手动使用了... injector.get(“$ http”),那么您可能从错误的注入器实例中检索了$ http服务。

这就是我们发生的事情,花了很长时间才弄明白。在这种情况下,即使$ http包含在$ apply中,也不会发送请求。

答案 2 :(得分:1)

当事件在Angular“外部”触发时会发生这种情况,Angular对此一无所知。

模糊事件来自DOM,或者您可能有一个触发更新的AJAX回调。您会注意到,只有在以某种方式与应用程序交互导致Angular唤醒之后才会发生任何事情。 George Thomas的回答是正确的 - 你必须戳Angular $scope以使其了解事件 - 但根据Angular开发人员的说法,更正确的方法是将代码包装在$apply()函数中,如下所示:

$("#myElement").blur(function() {
  $scope.$apply(function() {
    $http({method: 'GET', url: '/someUrl'});
  });
});

这样,代码中的错误就会被正确地传播给Angular。

我在Misko Hevery(创建它们的开发人员:http://www.youtube.com/watch?v=WqmeI5fZcho)的指令中非常好地发现了这些信息。如果你已经在项目上使用Angular了一段时间,但不太确定究竟发生了什么,那么这段视频就是你生命中度过的50分钟!