Я использую нг-повтора, чтобы создать ряд полей ввода в форме:Необходимо обновить модель внутри AngularJS директивы с помощью сенсорного экрана
<div class="col-sm-6 input" data-ng-repeat="v in values">
<div data-prefix-numeric-input data-prefix-name="{{ v.name }}">
<input type="number" id="{{v.name}}" data-ng-model="form.numberArray[v.name]" data-number-validation />
</div>
</div>
я использую некоторые CSS, чтобы скрыть стандартный ввод: тип = число прядильщики, используя следующую директиву для создания кнопок, более подходящих для использования на сенсорном экране.
directives.directive('prefixNumericInput', ['$compile', function ($compile) {
function getInputElement(attrs, element) {
var inputTagType = attrs['cpNumericInput'].length ? attrs['cpNumericInput'] : 'input';
return element.find(inputTagType);
}
function getInputValue(element) {
var currentValue = element[0].valueAsNumber;
return isNaN(currentValue) ? 0 : currentValue;
}
return {
restrict: 'A',
templateUrl: 'html-templates/numeric-input.html',
replace: false,
transclude: true,
require: '^form',
scope: {
prefixName: '@'
},
link: function (scope, element, attrs, formController, transcludeFn) {
transcludeFn(function (clone) {
var placeholder = element.find('placeholder');
placeholder.replaceWith(clone);
});
var intervalId, inputElement = getInputElement(attrs, element);
inputElement.addClass('form-control');
// Add our buttons after the input's parent element
$(inputElement[0].parentElement).after($compile('<div class="float-right">' +
'<button type="button" class="btn btn-primary inc-button" data-cp-touchstart="incrementStart()" data-cp-touchend="stop()" data-ng-click="increment()">+</button>' +
'<button type="button" class="btn btn-primary inc-button" data-cp-touchstart="decrementStart()" data-cp-touchend="stop()" data-ng-click="decrement()">-</button>')(scope));
function increment() {
inputElement[0].value = 1 + getInputValue(inputElement);
scope.$parent.$digest();
}
function decrement() {
var currentValue = getInputValue(inputElement);
inputElement[0].value = currentValue > 0 ? currentValue - 1 : 0;
}
scope.increment = increment;
scope.decrement = decrement;
scope.incrementStart = function() {
increment();
intervalId = setInterval(increment, 100);
}
scope.stop = function() {
clearInterval(intervalId);
}
scope.decrementStart = function() {
decrement();
intervalId = setInterval(decrement, 100);
}
}
};
}]);
Шаблон выглядит следующим образом:
<div class="input-group">
<span class="input-group-addon">{{prefixName}}</span>
<placeholder></placeholder>
</div>
Это хорошо работает для одного вопроса, за исключением. Нам нужно только одно из полей ввода, чтобы иметь значение. Когда форма отправляется, запускается другая директива (см. Приведенную выше проверку числа). Это просто проверяет, имеет ли какое-либо из значений модели что-то большее, чем нуль. Если это так, то проверяется контроль. Однако, если пользователь использует сенсорный экран и увеличивает значение для одного из полей дальше по странице, каждое поле ввода до поля со значением считается недействительным. Это связано с тем, что до тех пор, пока он фактически не попадет в поле со значением, значение модели не будет установлено. Я сбрасывал массив модели (form.numberArray) в консоль в директиве проверки и мог видеть, что каждое значение добавлялось при каждом запуске директивы проверки.
Что мне нужно - это обновить модель при нажатии кнопки. Я попытался использовать scope. $ Parent. $ Apply, но просто получил ошибку «in progress».
Любые предложения, рекомендации или рекомендации с благодарностью получены.