Javascript 为什么将ng select替换为自定义指令会导致$http请求不会每隔一次发送一次
编辑我现在已经通过在指令模板中使用Javascript 为什么将ng select替换为自定义指令会导致$http请求不会每隔一次发送一次,javascript,ajax,angularjs,Javascript,Ajax,Angularjs,编辑我现在已经通过在指令模板中使用ng click修复了这个错误,但是我仍然有兴趣知道ng click与元素有什么不同。bind以及为什么它很重要 我确实有一个ng选择框来更新我的模型 --速率性能-- 在漫长的验证过程结束时,它创建了一个新的$http请求(通过$resource.$update)并保存了记录 我现在改为使用自定义指令 它附加了下面的侦听器(实际的侦听器稍微复杂一些,但我已经非常严格地检查了它是否总是按预期触发tune.resource.$update) 现在,奇数单击
ng click
修复了这个错误,但是我仍然有兴趣知道ng click
与元素有什么不同。bind
以及为什么它很重要
我确实有一个ng选择框来更新我的模型
--速率性能--
在漫长的验证过程结束时,它创建了一个新的$http
请求(通过$resource.$update
)并保存了记录
我现在改为使用自定义指令
它附加了下面的侦听器(实际的侦听器稍微复杂一些,但我已经非常严格地检查了它是否总是按预期触发tune.resource.$update
)
现在,奇数单击创建$http
对象但不发送,偶数单击发送先前创建的$http
对象并创建并成功发送一个新对象。即使单击指令的不同实例,这种情况也会持续发生。我试过在范围上使用$digest
和$apply
,但它们没有任何影响(我不确定它们是否应该,因为$http
在我看来,它应该独立于摘要周期运行)
有人能想到问题出在哪里吗
完整指令代码
模板呢
{{rating.value}
更改:
element.bind('click', function (ev) {
tune.resource.$update();
});
致:
我们应该做到这一点。
bind('click')
和ng click
之间的区别在于ng click
触发角度$digest
循环,而bind('click')
不会。
任何
$http
或$resource
请求仅在角度$digest
循环(内部角度事件循环)内调用时触发对服务器的请求。因此,在您的案例中,您调用了resource.update
,但超出了angular$digest
周期,所以在下次触发angular事件循环(例如,执行ng更改)并启动对服务器的请求之前,不会向服务器发出请求,而只是“安排”了请求 不完全清楚问题是什么,但重要的是要知道,如果您在外部(非角度)代码中更改范围对象(如单击处理程序),那么您可以使用$apply
更改范围,因此角度知道修改非常好的解释。增加了我对无止境的理解
directives.directive('jPerformanceRater', function () {
return {
// transclude: true,
scope: true,
templateUrl: '/views/directives/performance-rater.html',
compile: function(element, attrs) {
return function (scope, element, attrs) {
var tune = scope[attrs.tune || 'tune'];
scope.tune = tune.tune;
element.bind('click', function (ev) {
ev.cancelBubble = true;
var btn = ev.target.className.indexOf('icon') > -1 ? ev.target.parentNode : ev.target;
if (btn.className.indexOf('btn') === -1) {
return;
}
tune.dummyStandard = +btn.textContent;
tune.update(); // most of the validation happens in here and then it calls resource.$update()
});
element.addClass('performance-rater');
};
}
};
});
<span class="btn btn-small" ng-repeat="rating in dropdowns.playback" type="checkbox"
title="{{rating.label}}">{{rating.value}}<i class="icon icon-star{{rating.value == 0 ? '-empty' : ''}}"></i></span>
element.bind('click', function (ev) {
tune.resource.$update();
});
element.bind('click', function (ev) {
scope.$apply(function(){
tune.resource.$update();
});
});