2017-06-30 9 views
0

私のangularJSモデルとデータベースの間で自動同期を実装しようとしています。

私は私が私の変数products_copy更新するデータベースからのデータを取得するには、以下の機能ごとに10秒を実行している:私は私の実際を更新したいこのデータに変更があるたび

$interval(function(){$scope.getProductsSync();},10000); 

$scope.getProductsSync = function() { 
    var q = $q.defer(); 
    $http({ 
     url: '/getData/getProducts.php', 
     method: "POST", 
     data: {"user_id":$scope.user_id} 
    }) 
    .then(function(response) { 
     if(response.data.valid) 
     { 
      console.log('Products sync complete: '+new Date().toLocaleTimeString()); 
      console.log(response.data.products); 
      $scope.products_copy = response.data.products; 
      q.resolve('Products sync complete'); 
     } 
     else if(response.data.msg=="offline") 
     { 
      console.log('Products sync offline'); 
      q.resolve('Products sync offline'); 
     }  
     else 
     { 
      console.log('Products sync error'); 
      console.log(response); 
      q.reject('Products sync error'); 
     } 
    }, 
    function(response) { 
     console.log('Products sync error'); 
     console.log(response);  
     q.reject('Products sync error'); 
    }); 
    return q.promise;    
    } 

をアレイによって定義される私のモデルの製品リスト製品。したがって、$ watchCollectionサービスを使用してデータの変更を検出し、変更があったときにモデルを更新しています。ただし、データベースからのデータは変更されていなくても、各呼び出しでこの変更がトリガーされます。

私のような配列の変化がある場合にのみイベントがトリガされるようにしたい
$scope.$watchCollection('products_copy', function (newValue, oldValue, scope) { 
    if(newValue!==oldValue) 
    { 
    console.log('Watch on products was called'); 
    console.log('Old value: '+oldValue); 
    console.log('New value: '+newValue); 
    $scope.products = newValue; 
    } 
}); 

  1. 取り除きアイテム
  2. 編集いずれかの項目
の任意のプロパティ項目を追加するには

編集1:

それをangular.equalsに変更しましたが、それでもすべての呼び出しでトリガーになりました。しかし、コンソールの各項目を調べると、angleは、項目間で変化するプロパティ$$ hashkeyを追加していることに気付きました。どのようにこれを解決するための任意のアイデア?

答えて

0

あなたは、各応答にあなたは$ scope.products_copyへの新しい参照し、そのそこに」どんなにを割り当てるので、それはどのようにすべきである

$scope.$watchCollection('products_copy', function (newValue, oldValue, scope) { 
    if(!angular.equals(newValue, oldValue)) 
    { 
    console.log('Watch on products was called'); 
    console.log('Old value: '+oldValue); 
    console.log('New value: '+newValue); 
    $scope.products = newValue; 
    } 
}); 
+0

これは** s ** – noppa

+0

で正しいです、angular.equalsです。正しい、更新されました –

+0

私はangular.equalsを使ってみましたが、それは毎回トリガします。しかし、私はコンソール上の各項目をチェックし、$$ hashkeyと呼ばれるものがあります。これは新しいフェッチごとに異なる各項目に挿入されています。これは不平等になっています。どのように私はこれを解決する任意のアイデア? –

0

(object2は、オブジェクト1)angular.equalのために試すことができますあなたは!== OLDVALUEあなたがreferecesをnewValueに比較しないとき、彼らは常に異なっているその中にデータの変更なし、再

あなたは

var a = []; 
var b = []; 
console.log(a===b); // false 

// the both are empty and seems to be equal 

を試す場合は、データをチェックする必要が古いデータと新しいデータの内部お試しくださいangular.equals

0

問題は、角度が$$ hashKey属性を挿入していて、同じオブジェクトでも違いが生じていたことです。このフィールドを削除すると、私のトリックになりました。

関連する問題