J'utilise cette fonction pour regarder un tableau d'objets pour les modifications: Comment puis-je obtenir un objet dans lequel la propriété a été modifiée afin que je puisse le pousser dans un tableau?
Par exemple: p>
3 Réponses :
Je ne vois pas un moyen actuellement en angulaire pour obtenir l'objet modifié ... Je soupçonne que vous devriez peut-être traverser le nouveau tableau et essayer de trouver les différences avec le vieux tableau ... p>
C'est 2015 maintenant. Y a-t-il une mise à jour sur ce sujet? J'ai passé toute cette journée à rechercher comment détecter l'objet qui est changé sans chance. Déteste d'utiliser une montre profonde et une comparaison manuelle.
Il n'y a toujours pas d'option comme celle-ci pour $ Watch, mais vous pouvez utiliser JQuery Plugin pour cela, http://archive.plugins.jquery.com/project/jquery-diff
J'ai implémenté Angularjs à l'aide de $ Watch, MB Ceci peut aider P>
//History Manager Factory .factory('HistoryManager', function () { return function(scope) { this.container = Array(); this.index = -1; this.lock = false; //Insert new step into array of steps this.pushDo = function() { //we make sure that we have real changes by converting to json, //and getting rid of all hash changes if(this.container.length == 0 || (angular.toJson(scope.widgetSlider) != angular.toJson(this.container[this.index][0]))) { //check if current change didn't came from "undo" change' if(this.lock) { return; } //Cutting array, from current index, because of new change added if(this.index < this.container.length-1) { this.container = this.container.slice(0, this.index+1); } var currentStepSlider = angular.copy(scope.widgetSlider); var selectedWidgetIndex = scope.widgetSlider.widgets.indexOf(scope.widgetCurrent); //Initialising index, because of new "Do" added this.index = this.container.length; this.container.push([currentStepSlider, selectedWidgetIndex]); if (this.onDo) { this.onDo(); } } } //Upon undo returns previous do this.undo = function() { this.lock = true; if(this.index>0){ this.index--; scope.widgetSlider = angular.copy(this.container[this.index][0]); var selectedWidgetIndex = this.container[this.index][1]; scope.widgetCurrent = scope.widgetSlider.widgets[selectedWidgetIndex]; } this.lock = false; } //Upon redo returns next do this.redo = function() { if(this.index < this.container.length-1) { this.index++; scope.widgetSlider = angular.copy(this.container[this.index][0]); var selectedWidgetIndex = this.container[this.index][1]; scope.widgetCurrent = scope.widgetSlider.widgets[selectedWidgetIndex]; } } } })
= = ====== P> J'ai finalement proposé cette solution: p>
Je sais que cette réponse a plus de 2 ans, mais elle est venue sur une recherche Google, donc je vais y ajouter un avertissement. Vous devez être vraiment prudent avec le nombre de veilleurs que vous ajoutez. L'ajout d'une montre pour chaque élément de la liste pourrait vraiment ralentir votre application si la liste devient trop grande.
@D_naish je suis totalement d'accord. À l'époque, quand j'ai posté la réponse I (avec beaucoup de gens, je pense) n'était pas si consciente des problèmes que vous pouvez avoir avec des montres. Drôle de voir à quel point les choses changent vite. Merci pour le commentaire!
Aiderait à voir comment les articles sont changés. Pourrait avoir accès à l'objet à ce moment-là. Le code montré est beaucoup trop simplifié. Créez une démonstration indiquant l'utilisation de l'utilisation. De plus, pourquoi avez-vous besoin d'une matrimentée stockée comme mondiale en dehors de l'angulaire?