Una de las cosas interesantes que AngularJS puede hacer es aplicar un filtro a una expresión de enlace de datos en particular, que es una forma conveniente de aplicar, por ejemplo, el formato de fecha o moneda específico de la cultura de las propiedades de un modelo. También es bueno tener propiedades calculadas en el ámbito. El problema es que ninguna de estas características funciona con escenarios de enlace de datos bidireccionales, solo enlace de datos unidireccional desde el alcance hasta la vista. Esto parece ser una omisión flagrante en una biblioteca de otra manera excelente, ¿o me estoy perdiendo algo?
En KnockoutJS , pude crear una propiedad calculada de lectura / escritura, que me permitió especificar un par de funciones, una que se llama para obtener el valor de la propiedad y otra que se llama cuando se establece la propiedad. Esto me permitió implementar, por ejemplo, una entrada consciente de la cultura, lo que permitió al usuario escribir "$ 1.24" y analizarla en un flotante en ViewModel, y tener cambios en ViewModel reflejados en la entrada.
Lo más parecido que puedo encontrar similar a esto es el uso de $scope.$watch(propertyName, functionOrNGExpression);
Esto me permite tener una función invocada cuando una propiedad en los $scope
cambios. Pero esto no resuelve, por ejemplo, el problema de entrada consciente de la cultura. Observe los problemas cuando intento modificar la $watched
propiedad dentro del $watch
propio método:
$scope.$watch("property", function (newValue, oldValue) {
$scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
$scope.property = Globalize.parseFloat(newValue);
});
( http://jsfiddle.net/gyZH8/2/ )
El elemento de entrada se confunde mucho cuando el usuario comienza a escribir. Lo mejoré dividiendo la propiedad en dos propiedades, una para el valor no analizado y otra para el valor analizado:
$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/ )
Esto fue una mejora con respecto a la primera versión, pero es un poco más detallado, y observe que todavía hay un problema con la parsedValue
propiedad de los cambios de alcance (escriba algo en la segunda entrada, que cambia la entrada parsedValue
directamente. Observe que la entrada superior no actualizar). Esto puede suceder por una acción del controlador o por cargar datos de un servicio de datos.
¿Hay alguna manera más fácil de implementar este escenario usando AngularJS? ¿Me falta alguna funcionalidad en la documentación?
fuente
ngModelCtrl
)$scope
directamente, eso es lo que se configurará el modelo ... hasta que el usuario interactúe con el cuadro de texto. En ese punto, cualquier analizador puede afectar el valor del modelo. Además de un analizador, puede agregar un $ watch a su controlador para transformar el valor del modelo.