我有一个指令响应从输入元素触发的Blur事件,然后最终导致调用Angular $ http服务以发出适当的HTTP请求。
正确调用$ http服务并生成预期的承诺,但实际的HTTP请求不会立即生成。它只会在进行其他类型的DOM交互后才会触发。
为什么不立即提出请求?我怎么能强迫他们立即制作呢?
Angular v1.1.5
答案 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分钟!