2013-04-20 11 views
6

mogę używać tej funkcji, aby oglądać tablicę obiektów do zmian:Jak uzyskać obiekt, który został zmieniony w angularjs?

$scope.$watch('Data', function (newVal) { /*...*/ }, true); 

Jak mogę uzyskać obiekt, w którym nieruchomość została zmieniona tak, że mogę wcisnąć ją w tablicy? Na przykład:

var myApp = angular.module("myApp", []); 

myApp.factory("Data", function(){ 
var Data = [{id:1, property: "Random"}, {id:2, property: "Random again"}]; 
return Data; 
}); 

var myBigArray = []; 

function tableCtrl($scope, Data){ 
    $scope.TheData = Data; 
    $scope.$watch("TheData", function() { 

    //Here an object should be pushed 
    myBigArray.push(">>Object in which property has been changed <<<"); 
    }, true); 
} 
+1

pomogłoby zobaczyć, jak elementy są zmieniane. Może mieć dostęp do obiektu w tym momencie. Przedstawiony kod jest zbyt uproszczony. Stwórz demo pokazujące przypadek użycia. Poza tym dlaczego potrzebujesz tablicy przechowywanej jako globalna poza kanciastą? – charlietfl

Odpowiedz

2

nie widzę sposobu obecnie kątowe, aby uzyskać zmieniony obiekt ... Podejrzewam, że może trzeba przemierzać nową tablicę i spróbować znaleźć różnice w starej tablicy. ..

+0

Jest teraz 2015. Czy są jakieś aktualizacje na ten temat? Cały dzień spędziłem na wyszukiwaniu, jak wykryć obiekt, który zmienia się bez powodzenia. Nienawidzę używać głębokiego zegarka i porównania ręcznego. – Codism

0

nadal nie ma opcji jak ten zegarek za USD, ale można użyć jQuery plugin, że http://archive.plugins.jquery.com/project/jquery-diff

I wdrożone Undo/redo z angularjs korzystających $ zegarek mb to może pomóc

//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]; 
      } 
     } 
    } 
}) 

;

2

Edit: Zauważ, że to rozwiązanie okazuje się być złą praktyką, ponieważ jest dodanie wielu obserwatorów, co jest coś, czego nie chcą, ponieważ ma spadku wydajności.

=======

I w końcu przyszedł z tego rozwiązania:

items.query(function (result) { 
    _(result).each(function (item, i) { 
     $scope.items.push(item); 
     $scope.$watch('items[' + i + ']' , function(){ 
      console.log(item); // This is the item that changed. 
     }, true); 
    }); 
}); 
+0

Wiem, że ta odpowiedź ma ponad 2 lata, ale pojawiła się w wyszukiwarce Google, więc dodam do niej ostrzeżenie. Musisz NAPRAWDĘ uważać, ile zegarków dodasz. Dodanie zegarka dla każdego elementu na liście może naprawdę spowolnić Twoją aplikację, jeśli lista stanie się zbyt duża. –

+1

@D_Naish Całkowicie się zgadzam. Wtedy, kiedy opublikowałem odpowiedź, ja (wraz z wieloma osobami, o których myślę), nie zdawałem sobie sprawy z problemów, które możesz mieć ze swoimi zegarkami. Zabawne, jak szybko zmieniają się rzeczy. Dziękuję za komentarz! –

Powiązane problemy