2013-04-20 38 views
6

tôi sử dụng chức năng này để xem một mảng của các đối tượng cho những thay đổi:Làm thế nào để có được một đối tượng đã được thay đổi trong angularjs?

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

Làm thế nào tôi có thể nhận được một đối tượng, trong đó tài sản đã được thay đổi để tôi có thể đẩy nó trong một mảng? Ví dụ:

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

sẽ giúp để xem cách mục được thay đổi. Có thể có quyền truy cập vào đối tượng tại thời điểm đó. Mã hiển thị quá đơn giản. Tạo bản trình diễn hiển thị trường hợp sử dụng. Ngoài ra tại sao bạn cần mảng được lưu trữ như là toàn cầu bên ngoài góc? – charlietfl

Trả lời

2

Tôi không thấy một cách hiện trong góc để có được những đối tượng đã thay đổi ... Tôi nghi ngờ bạn có thể cần phải đi qua các mảng mới và cố gắng tìm sự khác biệt với các mảng cũ. ..

+0

Đó là năm 2015 ngay bây giờ. Có bất kỳ cập nhật nào về chủ đề này không? Tôi đã dành cả ngày tìm kiếm cách phát hiện đối tượng đang được thay đổi mà không có may mắn. Ghét sử dụng đồng hồ và so sánh thủ công sâu. – Codism

0

Hiện vẫn còn không có lựa chọn như thế này với $ xem, nhưng bạn có thể sử dụng jQuery plugin cho rằng, http://archive.plugins.jquery.com/project/jquery-diff

tôi thực hiện undo/redo với AngularJS sử dụng $ xem, mb này có thể giú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]; 
      } 
     } 
    } 
}) 

;

2

Chỉnh sửa: Lưu ý rằng giải pháp này hóa ra là một hành động không tốt vì nó đang thêm rất nhiều người theo dõi, đó là điều bạn không muốn vì nó có hình phạt hiệu suất.

=======

tôi cuối cùng đã đưa ra giải pháp này:

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

Tôi biết câu trả lời này là hơn 2 tuổi, nhưng nó đã đưa ra một tìm kiếm google vì vậy tôi sẽ thêm một cảnh báo cho nó. Bạn cần phải thật cẩn thận với bao nhiêu đồng hồ bạn thêm. Thêm đồng hồ cho mỗi mục trong danh sách có thể thực sự làm chậm ứng dụng của bạn nếu danh sách quá lớn. –

+1

@D_Naish Tôi hoàn toàn đồng ý. Quay lại sau đó khi tôi đăng câu trả lời tôi (cùng với nhiều người tôi nghĩ) không phải là nhận thức được những vấn đề bạn có thể có với đồng hồ. Vui khi thấy mọi thứ thay đổi nhanh như thế nào. Cảm ơn bạn đã bình luận! –

Các vấn đề liên quan