¿Cómo hacer el filtrado bidireccional en AngularJS?

Una de las cosas interesantes que AngularJS puede hacer es aplicar un filtro a una expresión de enlace de datos particular, que es una forma conveniente de aplicar, por ejemplo, la moneda específica de la cultura o el formato de fecha de las propiedades de un modelo. También es bueno tener propiedades computadas en el alcance. El problema es que ninguna de estas características funciona con escenarios de enlace de datos bidireccionales, solo un enlace de datos unidireccional desde el alcance hasta la vista. Esto parece ser una omisión evidente en una excelente biblioteca, ¿o me estoy perdiendo algo?

EnKnockoutJS, Podría crear una propiedad computada 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 que tiene en cuenta la cultura, lo que permite al usuario escribir "$ 1.24" y analizarla en un flotante en el modelo de vista, y hacer que los cambios en el modelo de vista se reflejen en la entrada.

Lo más cercano que pude encontrar similar a esto es el uso de$scope.$watch(propertyName, functionOrNGExpression); Esto me permite tener una función invocada cuando una propiedad en el$scope cambios Pero esto no resuelve, por ejemplo, el problema de entrada consciente de la cultura. Tenga en cuenta los problemas cuando intento modificar el$watched propiedad dentro de la$watch método en sí:

$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é al dividir 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 deparsedValue la propiedad del alcance cambia (escriba algo en la segunda entrada, que cambia laparsedValue directamente. note que la entrada superior no se actualiza). Esto puede suceder a partir de una acción del controlador o al cargar datos desde un servicio de datos.

¿Hay alguna forma más fácil de implementar este escenario utilizando AngularJS? ¿Me falta alguna funcionalidad en la documentación?

Respuestas a la pregunta(1)

Su respuesta a la pregunta