0

$scope.$watch 関数を制御しようとしています。現在、イテレーションで無限ループが発生しています。

$scope.$watch('dashboards', function(newVal, oldVal) {
    if (newVal !== oldVal) {
        $scope.dashboard = $localStorage.sample;
        $scope.dashboards['1'].id = $scope.dashboards[1].id + 1;
        $localStorage.sample = $scope.dashboards[1];
        console.log('newval: '+$scope.dashboards['1'].id);
    } else {
        $scope.$storage = $localStorage;
        $localStorage.sample = $scope.dashboards[1];
        $scope.dashboard = $localStorage.sample;
        $scope.dashboards['1'].id = $scope.dashboards[1].id.length + 1;
        $localStorage.sample = $scope.dashboards[1];
    console.log('oldval: '+$scope.dashboards['1'].id);
    }
}, true);

これが私のscope.dashboardsです:

$scope.dashboards = {
        '1' : {
            id : '1',
            widgets : [{
                code : "bla1.html",
                col : 0,
                row : 0,
                sizeY : 1,
                sizeX : 2,
                title : "Bla1"
            }, {
                code : "bla2.html",
                col : 2,
                row : 0,
                sizeY : 2,
                sizeX : 2,
                title : "Bla2"
            }, {
                code : "bla3.html",
                col : 0,
                row : 4,
                sizeY : 1.5,
                sizeX : 2,
                title : "Bla3"
            }
}

私が達成しようとしているのは、$scope.dashboards 内のウィジェットの位置が変更されるたびに、localStorage に新しい ID を保存して、その位置の状態を保存し、ブラウザーを閉じたり更新したりしたときにもそれが維持されるようにすることです。セッション/位置を保持します。どうすれば私がこれに取り組むことができるかについての考えを持っているかもしれませんか? ありがとうございました!

4

2 に答える 2

-1

使用できるアプローチの大まかな概要は次のとおりです。

var modificationInProgress = false;
$scope.$watch('dashboards', function(newVal, oldVal) {
  if (!modificationInProgress) {
    modificationInProgress = true;
    // modify dashboards
  }
  $timeout(function() {
    modificationInProgress = false;
  }, 0);
});

ダッシュボードが同じティックで複数回変更されることを期待している場合、興味深いバグが発生する可能性があります。ただし、ダッシュボードがティックごとに 1 回だけ変更されることを期待している場合 (たとえば、ユーザーがボタンをクリックしたとき)、これは機能するはずです。

しかし - あなたのコードは奇妙です。同じ変数を監視して変更しないようにリファクタリングすることが、おそらく最善の策だと思います。たとえば、無限ループの問題を回避するために、別のオブジェクトを監視し、それらが移動された回数を別のオブジェクトに保存することができます。

于 2014-12-19T07:31:01.490 に答える