我有多個控制器使用相同的功能。爲了保持乾爽我已經嘗試了兩種不同的方式來共享控制器之間的功能,我在想什麼是共享功能的最佳做法:正在使用服務來控制控制器之間的最佳實踐?
- 嵌套控制器。聲明並向作用域添加父控制器中的所有共享函數,並且嵌套控制器調用父函數。
- 服務。在服務中聲明共享函數。
從我看過的文章看來,使用服務似乎是最好的方式來完成這樣的事情。這在大多數情況下都適用,但有一些邊緣情況我懷疑在服務中是否有特定的邏輯是合理的:
- 使用服務中的函數來修改服務中的數據。在deleteNote()函數中,我從相同服務中的對象刪除數組元素。我應該修改控制器中的數據,然後更新服務嗎?
- deleteCurrentPage()在同一個服務中調用不同的函數,這是否合適?或者應該在控制器中聲明deleteCurrentPage(),然後調用服務函數?
- deleteCurrentPage()將路由更改爲不同的狀態。出於某種原因,這似乎不太理想。路由器/狀態更改是否適合放入服務?如果不是,我應該如何處理這個問題,而不是回調?
TLDR:如果某些類型的共享功能屬於某個服務或控制器,我就會陷入困境。
感謝
示例服務功能
var serviceMethods = {
currentProjectData: null,
deleteCurrentPage: function (success, error) {
var projectId = $stateParams.projectId,
pageId = $stateParams.pageId;
serviceMethods.deletePage(projectId, pageId)
.then(function(response){
$state.go('project.settings', {projectId: projectId});
});
},
deletePage: function (projectId, pageId, success, error) {
var deferred = $q.defer();
$http.delete(constants.PROJECTS_URL + projectId + '/pages/' + pageId)
.success(function (data) {
serviceMethods.currentProjectData = data;
deferred.resolve(data);
})
.error(function (data, status, headers, config) {
error(error);
});
return deferred.promise;
},
deleteNote: function (id, success, error) {
var index = noteIndexFromId(id),
pageId = $stateParams.pageId;
if (index) {
serviceMethods.currentProjectData.pages[pageId].note.splice(index, 1);
}
},
'是否正在使用服務來控制控制器之間的最佳做法? - 是。服務是可以注入任何控制器並將服務值放入控制器範圍的單例。無論如何,服務可以更好地控制使用和暴露的位置。 –