Одна из интересных вещей, которую может сделать AngularJS, - это применить фильтр к определенному выражению привязки данных, что является удобным способом применения, например, валюты, зависящей от языка и региональных параметров, или форматирования даты свойств модели. Также хорошо иметь вычисляемые свойства в области видимости. Проблема в том, что ни одна из этих функций не работает со сценариями двусторонней привязки данных - только односторонняя привязка данных от области видимости к представлению. Это кажется вопиющим упущением в отличной библиотеке - или я чего-то упускаю?
В KnockoutJS я мог бы создать вычисляемое свойство чтения / записи, которое позволило мне указать пару функций: одну, которая вызывается для получения значения свойства, и другую, которая вызывается при установке свойства. Это позволило мне реализовать, например, ввод с учетом языка и региональных параметров, позволив пользователю ввести «$ 1,24» и преобразовать его в число с плавающей запятой в ViewModel, и внести изменения в ViewModel, отраженные во вводе.
Самое близкое, что я мог найти похожее на это, - это использование $scope.$watch(propertyName, functionOrNGExpression);
This, которое позволяет мне вызывать функцию при $scope
изменении свойства . Но это не решает, например, проблему ввода с учетом культуры. Обратите внимание на проблемы, когда я пытаюсь изменить $watched
свойство в самом $watch
методе:
$scope.$watch("property", function (newValue, oldValue) {
$scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
$scope.property = Globalize.parseFloat(newValue);
});
( http://jsfiddle.net/gyZH8/2/ )
Когда пользователь начинает печатать, элемент ввода очень сбивается с толку. Я улучшил его, разделив свойство на два свойства, одно для неанализируемого значения, а второе для проанализированного значения:
$scope.visibleProperty= 0.0;
$scope.hiddenProperty = 0.0;
$scope.$watch("visibleProperty", function (newValue, oldValue) {
$scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
$scope.hiddenProperty = Globalize.parseFloat(newValue);
});
( http://jsfiddle.net/XkPNv/1/ )
Это было улучшением по сравнению с первой версией, но оно немного более подробное, и обратите внимание, что все еще существует проблема, parsedValue
связанная с изменением свойства области видимости (введите что-нибудь во втором вводе, которое изменяет parsedValue
непосредственно. Обратите внимание, что верхний ввод не Обновить). Это может произойти из-за действия контроллера или из-за загрузки данных из службы данных.
Есть ли более простой способ реализовать этот сценарий с помощью AngularJS? Мне не хватает некоторых функций в документации?
источник
ngModelCtrl
.)$scope
напрямую, модель будет настроена на это ... до тех пор, пока пользователь не взаимодействует с текстовым полем . В этот момент любые парсеры могут повлиять на значение модели. В дополнение к синтаксическому анализатору вы можете добавить к контроллеру $ watch для преобразования значения модели.