编辑我现在已经通过ng-click
在指令的模板中使用修复了这个错误,但我仍然有兴趣知道ng-click
它有什么不同element.bind
以及为什么它很重要
我确实有一个 ng-select 框来更新我的模型
<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>