15

私はAngularを使い始めたばかりです。Google のドキュメントにあるサービスの例を読んで、コントローラで変数と関数を適切に保持するのではなく、なぜサービスを使用することを選択するのか疑問に思います。

angular.
 module('MyServiceModuleDI', []).
 factory('notify', function($window) {
    var msgs = [];
    return function(msg) {
      msgs.push(msg);
      if (msgs.length == 3) {
        $window.alert(msgs.join("\n"));
        msgs = [];
      }
    };
  });

function myController($scope, notify) {
  $scope.callNotify = function(msg) {
    notify(msg);
  };
}

この場合、いつサービスを利用することを選択しますか?

4

5 に答える 5

31

私の意見では、主な理由は次のとおりです。

  • コントローラー間でデータを永続化および共有します。
    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.

}]);
于 2013-05-23T09:46:12.397 に答える
8

私の経験に基づくと、サービスは次のシナリオで役に立ちます。

  1. 2 つ以上のコントローラー間で情報を共有したい場合、コントローラー間で通信するために
    使用することもできますが、ドキュメントの一般的な落とし穴のセクションが示唆しているように、これはグローバル スコープであるため、可能な限り回避する必要があります。サービスを使用すると、コントローラー間でデータを交換するために簡単に使用できるセッター メソッドとゲッター メソッドを定義できます。$rootScope

  2. 機能を複数回使用する場合 使用し
    ているすべてのテンプレートで繰り返される機能があるとします。通貨を米ドルからユーロに繰り返し換算し、金額をユーザーに表示する必要があるとします。ここでの「金額」は、航空券の購入、オンラインでの書籍の購入など、金銭に関連するあらゆるものであると想定できます。
    この機能はすべてのテンプレートで使用され、常にユーロで金額を顧客に表示しますが、データベース/モデルでは金額はユーロで保存されます。
    したがって、金額を米ドルからユーロに変換するサービスを作成できます。どのコントローラーでも呼び出して使用できます。機能は、コントローラー全体ではなく、1 つの場所に配置されるようになりました。したがって、将来、変更を加えて金額をポンドで表示することにした場合、1 つの場所でのみ変更を加える必要があり、それを使用するすべてのコントローラーに反映されます。

他にもいくつかのユースケースがありますが、今のところこれらだけが思い浮かびます。私が自分でサービスを使用する最も頻繁な使用例は、ポイント 1 - コントローラー間でのデータの受け渡しです。

于 2013-05-23T09:11:34.323 に答える
2

ナビゲーション中に変数をメモリに保持したい場合(たとえば、ユーザーセッションなど)(diffentsコントローラーを使用したdifferentsパーシャルが呼び出されます)。心に留めておく必要があります:

  • コントローラーは、呼び出すたびに再初期化されます。

  • サービスは一度だけ構築され、常に利用可能です。そのため、必要な情報を保持できます。

于 2013-05-23T09:29:01.433 に答える