Comment le faire de deux manière de filtrage dans AngularJS?

Une des choses intéressantes AngularJS pouvez faire est d'appliquer un filtre à une expression de liaison de données, qui est un moyen pratique de s'appliquer, par exemple, de la culture spécifique de la monnaie ou le formatage de la date de propriétés du modèle. Il est également agréable d'avoir les propriétés calculées sur le champ. Le problème est qu'aucun de ces fonctionnalités fonctionnent avec les deux sens de la liaison de données de scénarios - seulement un moyen de liaison de données à partir de la portée de la vue. Cela semble être une lacune évidente dans une excellente bibliothèque - ou ai-je raté quelque chose?

Dans KnockoutJS, j'ai pu créer lecture/écriture à une propriété calculée, ce qui m'a permis de spécifier une paire de fonctions, qui est appelé pour obtenir la valeur de la propriété, et qui est appelé lorsque la propriété est définie. Cela m'a permis de mettre en œuvre, par exemple, de la culture-courant d'entrée permettant à l'utilisateur de type "$1.24" et l'analyse que dans un flotteur dans le ViewModel, et avoir des changements dans le ViewModel reflète dans l'entrée.

La chose la plus proche que j'ai pu trouver similaire pour ce qui est de l'utilisation de $scope.$watch(propertyName, functionOrNGExpression); Cela me permet d'avoir une fonction appelée lorsqu'une propriété dans le $scope changements. Mais cela ne résout pas, par exemple, la culture-courant d'entrée du problème. Notez les problèmes lorsque je tente de modifier le $watched bien au sein de la $watch méthode elle-même:

$scope.$watch("property", function (newValue, oldValue) {
    $scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
    $scope.property = Globalize.parseFloat(newValue);
});

(http://jsfiddle.net/gyZH8/2/)

L'élément d'entrée est très confus lorsque l'utilisateur commence à taper. J'ai amélioré par le fractionnement de la propriété en deux propriétés, l'une pour la unparsed valeur et l'autre pour la valeur analysée:

$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/)

C'était une amélioration par rapport à la première version, mais est un peu plus verbeux, et notez qu'il existe toujours un problème de la parsedValue propriété des changements de périmètre (tapez quelque chose dans la deuxième entrée, qui modifie la parsedValue directement. avis du haut d'entrée n'est pas à jour). Cela peut se produire à partir d'un contrôleur de l'action ou de charger des données à partir d'un service de données.

Est-il un moyen plus facile à mettre en œuvre ce scénario en utilisant AngularJS? Suis-je manque certaines fonctionnalités dans la documentation?

InformationsquelleAutor Jeremy Bell | 2012-07-23