編集ディレクティブのテンプレートで使用してバグを修正しましたが、それが何が違うのか、なぜそれが重要なのか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>