2016-03-28 63 views
1

我是angularJs的初學者,因爲我認爲我的$scope有一些簡單的問題。如何啓用自動腕錶angularJs?

我有一個對象$scope.tasks我從服務器收到。它看起來像:

{ 
2: {id: 2, name: 'name1', user: 3}, 
3: {id: 3, name: 'name2', user: 1}, 
4: {id: 4, name: 'name3', user: 4}, 
} 

還我有一個函數,更新用戶任務:

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).success(function(data, status) { 
     $scope.tasks[taskId].user = userId; //#1 
    }); 
}; 

我也有自定義函數$scope.test(); 此功能必須於任務的用戶每次更改後執行,例如更新查詢,並在更新//#1

後,我試圖用這個目標$手錶$ watchCollection:

$scope.$watchCollection('tasks', function() { 
    $scope.test(); 
}) 

但這沒有幫助。現在,當我更新我的$ scope.tasks時,我必須在所有地方插入$scope.test()。這很令人悲傷。 我該如何自動執行?

+1

您什麼時候註冊手錶,以及如何觸發更改? –

+0

@DavidL我在我的控制器的末尾註冊了手表,並在select中用ng-change更改了觸發器。 – Neversmile

+0

這是你的問題。在開始時註冊它。如果你在最後註冊它,那麼它有一個合理的機會,它將不會註冊,直到它將要觀看的任何交互已經過去。最後,這可能是設計氣味的指示。您可能需要考慮採用回調式方法。 –

回答

1

使用手錶並不是很好的做法,它在代碼中。我會說,當你調用update調用成功時,你可以調用test方法。

而一個success回調post呼叫內做做出另一個電話以獲取更新的tasks列表與服務器的數據正確地使同步您的view數據。目前,您正在更新客戶端本身的特定記錄數據,這對於多用戶廣泛使用的以數據爲中心的應用程序來說沒有意義。如果假設您有1000正在訪問此應用程序的用戶,並且在您更新任何記錄時,其他用戶在同一頁面上也有updated/added任何記錄。所以這會在應用程序內部添加不一致的行爲。所以這就是爲什麼我建議你再做一個ajax來獲取數據&以保持你的應用程序看起來更加一致和準確。做一個更多的阿賈克斯電話將不會採取100ms,由於很好的理由,支付較少的成本。

代碼

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).then(function(response) { 
     var data = response.data; 
     $scope.getTasks(); 
     $scope.test(); 
    }); 
}; 

$scope.getTasks = function(){ 
    $http.get('getTasksUrl').then(function(response){ 
     $scope.tasks = response.data; 
    }); 
} 
+0

我知道使用$ watch可能會導致性能問題和某種不好的做法......但爲什麼你說這是一個「不好的做法」?我不認爲這總是一個不好的做法 –

+0

@PankajParkar是的,我同意你的看法。我示意性地展示了我的代碼,非常簡單。我正在用'$ scope.tasks [taskId] .user = userId;'來更新我的任務,如果查詢成功。在你的例子中,我不想再次獲取所有任務,如果我只更改任務中的一個用戶。我認爲這是不合理的 – Neversmile

+0

@ Gonzalo.-因爲你知道守望者在每個摘要週期中都會看着這個表達式。假設你有一個擁有深度守望者的大集合對象,這樣就會陷入困境並放慢速度你的應用程序性能..因此,儘量避免在設計應用程序時使用watcher ..我個人推薦這種方式.. –

0

您可以編寫帶有監視器A指令,穿上它你想觀看模式。但是如果我正確地理解了你的話,你需要在成功發佈請求後更新頁面上的數據,你可以通過在成功發佈後觸發get請求來實現這一點,或者在更壞的情況下,可以使用路由或狀態重新加載,具體取決於你使用哪個路由器。