Одна из интересных вещей, которую может выполнять AngularJS, - это применить фильтр к определенному выражению привязки данных, что является удобным способом применения, например, для конкретной культуры или форматирования даты свойств модели. Также неплохо иметь вычисленные свойства в области. Проблема в том, что ни одна из этих функций не работает с сценариями двухсторонней привязки данных - только односторонняя привязка данных из области видимости. Это похоже на вопиющее упущение в отличной библиотеке - или я что-то не хватает?
В KnockoutJS я мог бы создать вычисляемое свойство чтения/записи, что позволило мне указать пару функций, которые вызывается, чтобы получить значение свойства, и тот, который вызывается, когда свойство задано. Это позволило мне реализовать, например, вход в систему, ориентированный на культуру, - позволяя пользователю вводить "$ 1.24" и анализируя это в float в ViewModel и иметь изменения в ViewModel, отраженные на входе.
Самое близкое, что я мог найти, похоже на использование $scope.$watch(propertyName, functionOrNGExpression);
. Это позволяет мне вызвать функцию, вызываемую при изменении свойства в $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/)
Элемент ввода очень запутан, когда пользователь начинает печатать. Я улучшил его, разделив свойство на два свойства: одно для unparsed и одно для проанализированного значения:
$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? Не хватает ли некоторых функций в документации?