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在小部件的位置的改變,我會保存一個新的ID在localStorage中保存其職位狀態,以便在瀏覽器關閉/刷新時保留其會話/職位。也許你有一個想法,我將如何能夠在此工作?謝謝!

+0

您正在導致無限循環,因爲每當'$ scope.dashboards'變量發生變化並且$ watchcher被觸發時,您都會再次進行更改。 – 2014-12-19 07:03:26

+0

@NewDev有什麼解決方法你可能知道嗎? – bluestella 2014-12-19 07:06:51

+0

我不確定你想要做什麼,以及爲什麼你需要在每個$ scope.dashboards更改時更改$ scope.dashboards。 – 2014-12-19 07:13:20

回答

-1

的方法,你可以使用一個粗略的輪廓如下:

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

如果你希望儀表盤以同樣的節拍進行修改多次,這可能導致一些有趣的錯誤。但是,如果您只希望儀表板每次打勾修改一次(例如,當用戶單擊按鈕時),這應該可以工作。

但是 - 你的代碼很奇怪。我認爲重構它以避免觀察和修改同一個變量可能是您的最佳舉措。例如,您可能需要觀察其他對象並將其移動到單獨對象上的次數,以避免無限循環問題。

1

問題的根源在於,通過在$ watcher($scope.dashboards)中爲$ watchched的值分配不同的值,導致無限循環。

您應該避免使用$watch作爲更新$scope.dashboards.id的觸發器,並使用導致小部件更改的實際觸發器。 (題外話,但使用財產id是稍微尷尬 - id有一個非常具體的含義,我會改變它的「版本」或沿着這些行)

或者,另一種選擇是$ watch只有widgets屬性,而不是深度的dashboards

$scope.$watch("dashboards['1'].widgets", function(newVal, oldVal){ 
... 
}, true); 
相關問題