Я работаю над приложением, которое автоматически сохраняет изменения, когда пользователь что-то меняет, например, значение поля ввода. Я написал директиву autosave
, которая добавляется ко всем полям формы и должна автоматически запускать события сохранения.
шаблон:
<input ng-model="fooCtrl.name" autosave>
<input ng-model="fooCtrl.email" autosave>
директива:
.directive('autosave', ['$parse', function ($parse) {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
function saveIfModelChanged () {
// save object containing name and email to server ...
}
ngModel.$viewChangeListeners.push(function () {
saveIfModelChanged();
});
}
};
}]);
Пока у меня все работает нормально. Однако, когда я добавляю проверку в смесь, например, проверяя поле ввода как действительный адрес электронной почты, modelValue устанавливается на undefined
, как только viewValue изменяется на недопустимый адрес электронной почты.
Что я хотел бы сделать, так это: запомнить последнее действительное значение модели и использовать его при автосохранении. Если пользователь изменит адрес электронной почты на недействительный, объект, содержащий name
и email
, все равно должен быть сохранен на сервере. Используя текущий действительный name
и последний действительный email
.
Я начал с сохранения последнего допустимого значения модели следующим образом:
шаблон с добавленной проверкой:
<input type="email" ng-model="fooCtrl.name" autosave required>
<input ng-model="fooCtrl.email" autosave required>
директива с сохранением lastModelValue:
.directive('autosave', ['$parse', function ($parse) {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
var lastModelValue;
function saveIfModelChanged () {
// remeber last valid modelValue
if (ngModel.$valid) {
lastModelValue = ngModel.$modelValue;
}
// save object containing current or last valid
// name and email to server ...
}
ngModel.$viewChangeListeners.push(function () {
saveIfModelChanged();
});
}
};
}]);
Мой вопрос: как использовать lastModelValue
при сохранении, но сохраняя недопустимое значение в представлении?
ИЗМЕНИТЬ:
Другая возможность, как предложено Jugnu ниже, заключается в обертывании и управлении сборкой в валидаторах.
Я попытался сделать следующее: обернуть все существующие валидаторы и запомнить последнее действительное значение, чтобы восстановить его в случае сбоя проверки:
Object.keys(ngModel.$validators).forEach(function(validatorName, index) {
var validator = ngModel.$validators[validatorName];
ngModel.$validators[validatorName] = createWrapper(validatorName, validator, ngModel);
});
function createWrapper(validatorName, validator, ngModel){
var lastValid;
return function (modelValue){
var result = validator(modelValue);
if(result) {
lastValid = modelValue;
}else{
// what to do here? maybe asign the value like this:
// $parse(attrs.ngModel).assign(scope, lastValid);
}
return result;
};
}
Но я не уверен, как продолжить этот подход. Могу ли я установить значение модели без включения AngularJS и попытаться проверить это новое установленное значение?
v
в моей базе данных, для которых хранитсяv!==undefined
, и сэкономил бы себе несколько рабочих часов. Я понимаю, что вы, возможно, не сможете сделать это или сделать этот проект в учебных целях, просто мои мысли об эффективности разработки. - person Kevin Dreßler   schedule 21.09.2015