AngularJS regarder une propriété de l'objet dans un tableau d'objets
J'ai cette data
dans mon contrôleur
$scope.data = {
home: {
baseValue: "1",
name: "home"
},
contact: {
baseValue: "2",
name: "contract"
}
//a lot more options
};
avec le code html comme ceci:
<section class="content row" ng-repeat="item in data">
{{item.name}}
....
</section>
Maintenant, je veux savoir quand le baseValue
est changé, mais en raison de I en utilisant l'un des objets à l'intérieur de la variable de données, je ne peux pas watch
la propriété de façon plus simple.
J'ai essayé quelque chose comme ça, mais je boucle le tableau
$scope.$watch('data', function (newValue, oldValue, scope) {
//some code to compare the tow arrays, line by line
}, true);
Comment puis-je faire un simple $watch
savoir que lorsque le baseValue
est changé?
Des questions similaires:
- AngularJS regarder tableau d'objets pour la modification de données
- Comment obtenir un objet qui a été modifié dans angularjs?
- Comment profonde regarder un tableau dans angularjs?
Mise à JOUR 1
Je pourrais ajouter une montre, pour chaque objet, à savoir lorsque le baseValue
est modifié, mais il ne sera pas bien si j'ai eu un n
nombre d'objets, pas seulement quelques objets, comme dans cet exemple
$scope.$watch('data.home', function (newValue, oldValue, scope) {
//do some stuff with newvalue.baseValue
}, true);
$scope.$watch('data.contact', function (newValue, oldValue, scope) {
//do some stuff with newvalue.baseValue
}, true);
... //Adds more individual `watch`
- Vous voulez seulement savoir quand
baseValue
a changé, mais vous ne voulez pas d'ajouter une personne à surveiller? - À propos de la mise à jour 1, pouvez-vous définir "pas gentil" ?
- comment sur l'utilisation de propriété descripteurs, et de revenir à
*Timeout
's? - Avez-vous besoin de connaître l'ancienne valeur? Ou vous avez juste besoin de regarder pour les changements?
- Ou $watchGroup ? Une variante de $watch() où il regarde un tableau de watchExpressions. Si une expression dans la collection change le port d'écoute est exécutée.
Vous devez vous connecter pour publier un commentaire.
Basé sur votre question, vous pouvez utiliser ngChange pour regarder les changements de
baseValue
et de déclencher la fonction.HTML
Contrôleur
Si vous avez une version plus sophistiquée qui peut obtenir oldValue et newValue, vous pouvez vous référer à ce plunkr - http://plnkr.co/edit/hqWRG13gzT9H5hxmOIkO?p=preview
HTML
Contrôleur
ng-change
le rendement pourrait être impacté? C'est parce que la fonction sera exécutée non seulement lorsque la valeur est modifiée. Pour cette raison, il est préférable d'utiliser unwath
pour s'assurer que la fonction est exécutée uniquement lorsque les données sont mises à jour. Est-ce exact?Vous pouvez regarder un attribut de l'objet.
Si vous pouvez faire quelque chose comme
Pas testé, mais l'idée est simple.
ng-change
directive ne fonctionne qu'avec les valeurs modifiées par l'interaction lié aux intrants (cases à cocher dans mon cas). Je veux faire quelque chose lorsque les éléments du tableau baseValues changement, peu importe si ils ont changé de tenu entrées ou par programmation basculement entre eux.$scope->$apply()
après une modification. (Voir docs.angularjs.org/api/ng/type/$rootScope.Portée)$scope.$apply()
n'est pas autorisé (il est dit$digest()
est déjà le cas). Cependant, je suis un peu plus expérimenté angulaire et le problème peut avoir été liée à des étendues et des appels asynchrones.var w = $scope.$watch(...);
et plus tard, juste à appelerw();
pour annuler l'inscription.digest
cycles de travail. Mais je crois qu'avec votre commentaire que vous n'avez pas ce problème ?$scope.$watch("data[" + key + "].baseValue" .....)
n'a pas fonctionné pour moi, mais$scope.$watch("data['" + key + "'].baseValue" .....)
n'Dans ce genre de scénario, il n'existe aucun moyen de contourner en utilisant plusieurs montres, une autre façon de le faire est en utilisant
$watchCollection
à regarder le tableau de valeurs de l'objet, vous pouvez vous procurer ce tableau à l'aide de laObject.values
fonction.J'ai résolu avec cette solution: