gpt4 book ai didi

javascript - AngularJS 我如何观看 $viewValue 而不是 ngModel?

转载 作者:数据小太阳 更新时间:2023-10-29 05:10:13 26 4
gpt4 key购买 nike

我在输入上使用去抖:

<input type="text"
ng-model="model.qty"
ng-model-options="{ debounce : 1000 }"
min="{{model.min}}" max="{{model.max}}" step="1"
qty-input validate-model-setting>

我有一个指令来处理禁用此输入的递增按钮和递减按钮:

app.directive('qtyInput', function() {
return {
restrict: 'A',
require: '?ngModel',
link: function(scope, element, attrs, ngModelCtrl) {
scope.$watch(attrs.ngModel, function(n, o) {
var val = parseInt(n);
if(!isNaN(val)) {
if(val + 1 > model.max) {
scope.quantityIncDisabled = true;
} else {
scope.quantityIncDisabled = false;
}
if(val - 1 < model.min) {
scope.quantityDecDisabled = true;
} else {
scope.quantityDecDisabled = false;
}
}
});
}
}
});

问题是,这个指令上的 watch 正在查看模型。我需要它来查看 $viewValue。这是因为,由于去抖动,在输入输入和使用递增/递减按钮之间存在竞争条件。例如,您可以在输入达到 1(最小值)后反复点击减量按钮恰好 1 秒,只有这样,在去抖动完成后,减量按钮才会被禁用。相反,我希望在输入达到 1 时立即禁用按钮,而不是在等待完整的去抖秒之后。我最好的猜测是,这意味着在 $viewValue 上放置一个 $watch,但我不知道如何在指令中找到它。

供您引用,按钮本身通过更改输入的值然后触发输入来避免竞争条件,这使得去抖动在输入输入和使用按钮时都能流畅地工作。

   link: function(scope, element, attrs) {
element.bind('click', function() {
$timeout(function() {
var input = element.parent().find('input');
var changingTo = parseInt(input[0].value) + parseInt(scope.inc);
if(scope.inc < 0 || isNaN(changingTo)) {
var min = parseInt(input[0].min);
if(isNaN(changingTo)) {
changingTo = min;
} else if(changingTo < min) {
return;
}
} else {
var max = parseInt(input[0].max);
if(changingTo > max) {
return;
}
}
input[0].value = String(changingTo);
input.trigger('input');
});
});
}

最佳答案

文档有答案:https://code.angularjs.org/1.2.19/docs/api/ng/type/ngModel.NgModelController

你想像这样使用 $viewChangeListeners 而不是 $watch (你可能需要推送到 $formatters 而不是取决于去抖动的方式作品):

ngModelCtrl.$viewChangeListeners.push(function(){
var val = parseInt(ngModelCtrl.$viewValue);
if(!isNaN(val)) {
...
}
});

虽然我还没有玩过 debounce 选项,所以我不知道这是否能解决您的问题,但这就是您查看 viewValue 的方式。

关于javascript - AngularJS 我如何观看 $viewValue 而不是 ngModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25171921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com