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?
Vous devez vous connecter pour publier un commentaire.
Il s'avère qu'il existe une solution élégante à ce problème, mais ce n'est pas bien documentée.
Formatage des valeurs de modèle pour l'affichage peuvent être traitées par le
|
opérateur et angulaireformatter
. Il s'avère que le ngModel qui n'a pas seulement une liste de formateurs, mais aussi une liste des analyseurs.1. Utilisation
ng-model
pour créer les deux sens de la liaison de données2. Créer une directive dans votre angulaire module qui sera appliquée pour le même élément et qui dépend de la
ngModel
contrôleur3. Dans le
link
méthode, ajouter votre personnalisé des convertisseurs pour lengModel
contrôleur4. Ajouter votre nouvelle directive de l'élément qui a déjà le
ngModel
Voici un exemple de travail qui transforme le texte en minuscules dans le
input
et à l'arrière de majuscules dans le modèleLa La Documentation de l'API pour le Modèle de Contrôleur a également une brève explication et un aperçu des autres méthodes disponibles.
ngModelCtrl
.)$scope
directement, c'est ce que le modèle sera mis à... jusqu'à ce que l'utilisateur interagit avec la zone de texte. À ce moment, tous les analyseurs peut affecter la valeur de modèle. En plus d'un analyseur, vous pouvez ajouter un $montre à votre contrôleur de transformer le modèle de la valeur.