私の意見では、主な理由は次のとおりです。
コントローラー間でデータを永続化および共有します。
IE: データベースからデータをフェッチするサービスを作成します。それをコントローラー内に保存する場合、別のコントローラーに変更すると、データは破棄されます ($rootScope に保存しない限り、これは最善の方法ではありません)。 it) ですが、サービス内に保持すると (サービスはシングルトンです)、コントローラーを変更してもデータは保持されます。
コントローラー/ディレクティブ/サービスで使用される API を作成して、データ アクセス ロジックを抽象化します。
ビジネス ロジックをコントローラー内に保持し、データ ロジックをサービス内に保持します。
DRY (同じことを繰り返さないでください)。
IE: さまざまなコントローラーで必要な一連の関数があります。サービスがなければ、各コントローラーでコードを繰り返す必要があります。サービスを使用すると、この関数用に単一の API を作成し、すべてのコントローラー/ディレクティブ/に挿入できます。必要なサービス。
以下に例を示します。
var myApp = angular.module('myApp',[]);
//Here is the service Users with its functions and attributes
//You can inject it in any controller, service is a singleton and its data persist between controllers
myApp.factory('Users', function () {
//data logic
//fetch data from db and populate...
var name = "John";
var surname = "Doe"
function getName() { return name; }
function getFullName() { return name + ' ' + surname; }
function setName(newName) { name = newName; }
//API
return {
getName: getName,
getFullName: getFullName,
setName: setName
}
});
//An Util service with methods I will use in different controllers
myApp.factory('Util', function () {
//a bunch of useful functions I will need everywhere
function daysInMonth (month,year) {
return new Date(year, month+1,0).getDate();
}
return {
daysInMonth: daysInMonth
};
});
//Here I am injecting the User and Util services in the controllers
myApp.controller('MyCtrl1', ['$scope', 'Users', 'Util', function ($scope, Users, Util) {
$scope.user = Users.getFullName(); //"John Doe";
Users.setName('Bittle');
//Using Util service
$scope.days = Util.daysInMonth(05,2013);
}]);
myApp.controller('MyCtrl2', ['$scope', 'Users', 'Util', function ($scope, Users, Util) {
$scope.user = Users.getFullName(); //"Bittle Doe"; //The change that took place in MyCtrl1 hhas persisted.
}]);