4

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

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

为什么没有立即提出请求?我怎样才能强迫它们立即制作?

角v1.1.5

4

3 回答 3

19

原因

我最终在 GitHub ( https://github.com/angular/angular.js/issues/2442 ) 上的问题中找到了答案:

v1.1.4... 改变了 $http 的工作方式,使其被安排在 nextTick 上,而不是立即触发。这意味着如果您的 $http 是从不会导致 $digest 触发的东西中安排的,那么您的请求将不会被发送。您可以通过单击页面几次(在任何地方)来验证这是您所看到的行为,您应该会看到您的请求已发出。

一个解法

正如帖子所建议的那样,我触发了一个 $digest 循环,这导致我的 $http 生成的请求被立即触发。

scope.$apply();
于 2013-06-11T08:51:29.400 回答
2

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

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

于 2013-09-15T16:43:10.477 回答
1

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

blur 事件来自 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 分钟的美好时光!

于 2013-08-27T11:42:18.250 回答