2013-04-18 99 views
15

AngularJS應用程序中有多個控制器的原因是什麼?我現在已經構建了幾個角度的應用程序,我從來沒有遇到過一個問題,我認爲多個控制器會讓我更容易。AngularJS - 爲什麼有多個控制器

我仍然是一個n00b,從來沒有寫過單元測試,我的代碼不像它可能是可控的,所以我確信它只是無知。我聽說其他人有多個控制器。

換句話說:如何知道他們應該創建一個新的控制器?

回答

12

從我所看到的是一個角度應用程序應該有單獨的範圍單獨的控制器。例如,幾乎所有的應用程序都有用戶數據。你會希望有這個數據連接到用戶模式,用戶控制器內:

function UserCtrl ($scope) { 
    $scope.user = { 
     name: "bmorrow", 
     lastLogin: "4/16/2013" 
    }; 
} 

而且模板(我們認爲)將應用程序結構的特定部分內。例如,導航欄的右側或用戶詳細信息頁面上。我們通過使用ng-controller分配一個控制器來確定這部分的位置。這將創建所述控制器的scope並將相應的模型綁定到它。模型(我們的數據)通過控制器連接到視圖(HTML)。

假設應用程序有一個供用戶撰寫文章的頁面。我們可以創建另一個控制器,僅限於專門包含文章內容的HTML部分。

function ArticleCtrl ($scope) { 
    $scope.article = { 
     title: "Hello World", 
     body: "Lorem ipsum...." 
    }; 
} 

在上面這個簡單的例子中,兩個控制器的組合不會造成任何傷害。但是一旦你的應用程序開始增長,根據它所代表的數據在邏輯上組織你的控制器/視圖將會使你的代碼更加清晰和易於理解。減少不必要的複雜性將使一切更容易對你。使用一個控制器來處理所有事情是一個不必要的複雜性。

你可以在Basarat的答案中看到這一點。您不一定需要爲每個路由使用一個控制器,但這樣做有助於從邏輯上構建應用程序。

所以,要回答你的問題,你通常應該有一個控制器每類數據。用戶,文章,水果,蔬菜,交易等等。

閱讀關於Angular ControllersModel-View-Controller模式的更多信息,如果你還沒有。我希望這有幫助。

+1

我不確定您在示例中正確使用了數據。數據應存儲在工廠中,可以注入控制器。否則你會污染控制器,它會變成一個巨大的野獸。 – tylik 2014-11-01 00:24:17

+0

正如@tylik所提到的,分離關注點非常重要。應該使用工廠來查詢數據,因爲有很多情況下控制器可能需要多個類別的數據。 – 2016-04-21 01:16:38

+0

最近我見過許多開發人員只在絕對需要的時候使用不同的控制器,並且像這樣分離問題:'$ scope.app.user.name = ...'或$ scope.app.article.date = ...',我認爲這是一個非常實用的方法。 – adelriosantiago 2017-09-29 02:55:22

7

當您開始將應用程序分成多個視圖時,您肯定會需要更多的控制器。

例如當您開始使用路線(也稱爲深層鏈接)時,您將擁有一個模板網址以及與該模板一起使用的控制器(請參閱http://docs.angularjs.org/tutorial/step_07),例如

angular.module('phonecat', []). 
    config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
     when('/phones', {templateUrl: 'partials/phone-list.html', controller: PhoneListCtrl}). 
     when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}). 
     otherwise({redirectTo: '/phones'}); 
}]); 
1

我喜歡將控制器視爲「小工具」。我的後端一頁,他們可以打開ViewUsers控制器(小部件),它可以打開更多UserDetail控制器。

我猜如果你習慣了OOP,那麼想讓他們的範圍保持獨立和封裝感覺很自然。