为什么将 ng-select 替换为自定义指令会导致$http请求不会每隔一段时间发送一次
Why has replacing ng-select with a custom directive caused $http requests not to be sent every other time
edit 我现在通过在指令的模板中使用ng-click
修复了错误,但我仍然有兴趣知道ng-click
的作用与element.bind
不同以及为什么它很重要
我确实有一个 ng 选择框来更新我的模型
<td><select
ng-model="tune.dummyStandard"
ng-options="opt.value as opt.label for opt in dropdowns.playback"
ng-change="update()" >
<option value="">-- rate performance --</option>
</select></td>
在漫长的验证过程结束时,它创建了一个新的$http
请求(通过$resource.$update
)并保存了记录。
我现在已更改为使用自定义指令
<td j-performance-rater data-tune="tune"></td>
附加了以下侦听器(实际的侦听器有点复杂,但我已经非常严格地检查了它是否总是按预期触发tune.resource.$update
)
element.bind('click', function (ev) {
// code for validation and setting of model props
tune.resource.$update();
});
现在,奇数单击会创建$http
对象但不发送,偶数单击会发送以前创建的$http
对象并创建并成功发送一个新对象。即使单击在指令的不同实例上,也会始终发生这种情况。我尝试在范围上玩弄$digest
和$apply
,但它们没有任何影响(我不确定它们是否应该像$http
在我看来它应该独立于摘要周期)。
谁能想到问题可能是什么?
完整的指令代码
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();
});
});
应该做这个伎俩。bind('click')
和ng-click
之间的区别在于ng-click
触发角$digest
循环,而bind('click')
不会。任何$http
或$resource
请求仅在角度$digest
周期(内部角度事件循环周期)内调用时才触发对服务器的请求。因此,在您的情况下,您调用了resource.update
但在角度$digest
周期之外,因此不会向服务器发出请求,而只是"计划"直到下次触发角度事件循环(例如执行ng-change时)并启动对服务器的请求。
- Canvas+svg路径动画,在路径中的特定点暂停一段时间,然后继续
- 收集一段时间内的EMG数据.建议JS
- 在一段时间内切换文本
- 如何停止字幕文本一段时间,然后继续
- HTTP服务器在一段时间后停止(Node.js)
- Hammer.js过了一段时间就停止工作了
- Meteor-在一段时间内解锁模板(按日期)
- 画布在一段时间后开始滞后
- JS-在一段时间后水平移动图像
- AJAX 调用在获得响应并成功执行时会冻结浏览器一段时间
- 一段时间后调用函数,但只调用一次
- 为什么将 ng-select 替换为自定义指令会导致$http请求不会每隔一段时间发送一次
- 如果通过 ajax 调用 PHP 页面需要一段时间才能运行/返回(并且它设置了会话变量),则第二次 ajax 调用会看到
- 在页面加载时禁用 CSS 动画,但每隔一段时间工作一次
- 如何在浏览器中使用F12控制台在javascript中每隔一段时间执行一次
- 不要做不止一次,要做一段时间,但不要做
- 如何使setInterval在一段时间后或多次操作后停止
- 在RxJS中,对一段时间内的事件进行计数,并每秒产生一次总和
- oidc-client CheckSessionIFrame正确触发一次,然后每隔一段时间失败一次
- Javascript-在只运行一次脚本之前等待一段时间