5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[AngularJS] 3. サービス定義≪改訂≫

Last updated at Posted at 2015-12-04

目次
≪前の記事 2.モジュール、コントローラー、サービス≪改訂≫
≫次の記事 4.$watch≪改訂≫


【改訂】factroy()での定義をやめ、より自由度、応用性の高いservice()での定義に改訂しました。

AngularJSのMVCにおける「M (Model)」は、 サービス と呼ばれます。
2. モジュール、コントローラ、サービス≪改訂≫では、AngularJS標準のよく使われるサービスをいくつか紹介しました。
今回は、サービスを定義する方法について解説します。

#service()メソッド

サービスの定義は、 Angularモジュールのservice()メソッド を用いて行います。

サービスの定義
モジュール.service(サービス名, function(依存サービス, ....) {
    return サービスオブジェクト
});

service()メソッドの第1引数はこのサービスの名称になります。文字列で指定します。

第2引数はサービス本体を定義するための関数オブジェクトです。
この関数の引数には、サービス内で利用したい他のサービス(依存サービス)を指定します。
そして最後にサービスの本体となるオブジェクトを返します。

サービスの本体となるオブジェクトは、ハッシュオブジェクトやクラスなどです。
ここでは最も自由度や応用性の高い、クラスによる定義を解説します。

##クラスの定義
JavaScriptでのクラス定義の方法は、クラスの定義 および 即時関数でクラス定義を参照してください。サービスクラスの定義もこれに倣って行います。

##サービスクラスの定義
前述の通り、サービスクラスの定義は クラスの定義 に倣います。

サービスクラス定義
モジュール.service(サービス名, function(依存サービス, ....) {
    var 変数 = function(仮引数, ...) {

        〜 コンストラクタの処理 〜

    }

    〜 プロパティ、メソッドの定義 〜
    
    return 変数
});

以下の例では商品を表すモデルクラスをサービスとして定義しています。
クラスには商品の名前、単価、数量、合計額を持つプロパティがあり、単価と数量から合計額を計算するメソッドを持っています。
※即時関数を用い、取得したAngularモジュールモジュールオブジェクトを引数に渡しています。

sample03.html
(function(module) {
    module.service("Product", function(){
        /**
         * コンストラクタ
         */
        var product = function() {
            this.name  = "";
            this.price = 0;
            this.qty   = 0;
            this.total = 0;
        }
        var p = product.prototype;

        /**
         * 合計を計算する
         */
        p.calcTotal = function() {
            this.total = this.price * this.qty;
        }

        return product;
    });
})(angular.module("sampleModule"));

#サービスの利用
定義したサービスを利用するには、コントローラや他のサービスを定義する際に 依存サービス として指定する必要があります。
また今回の例ではサービスをクラスとして定義しているので、インスタンス化して使用することもできます。

サービスをコントローラで使用する
(function(module) {

    module.controller(コントローラ名, function(サービス, ...) {
	    〜 コントローラの処理 〜
	    
	    var 変数 = new サービス();
	});
    
})(モジュールオブジェクト);

以下は、前述の Productサービス をコントローラで利用する例です。

sample03.html
(function(module) {

    module.controller("sampleController", function($scope, $timeout, Product) {
        // Productクラスのインスタンスを $scope にセットする
        $scope.product = new Product();
    });
})(angular.module("sampleModule"));

#サンプルコード
※「計算する」ボタンで使用している ng-clickディレクティブ は、clickイベントに応じて行う処理を指定するものです(詳細は 5. イベント処理 で解説します)。
この例では、ボタンをクリックすると ProductクラスのcalcTotal()メソッド が呼び出されます。

sample03.html
<!DOCTYPE html>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script>
/**
 * アプリケーション モジュール オブジェクトの定義
 */
(function() {
    var module = angular.module("sampleModule", []);
})();

/**
 * 商品モデルクラス定義
 */
(function(module) {
    module.service("Product", function(){
        /**
         * コンストラクタ
         */
        var product = function() {
            this.name  = "";
            this.price = 0;
            this.qty   = 0;
            this.total = 0;
        }
        var p = product.prototype;

        /**
         * 合計を計算する
         */
        p.calcTotal = function() {
            this.total = this.price * this.qty;
        }

        return product;
    });
})(angular.module("sampleModule"));

/**
 * コントローラの定義
 */
(function(module) {
    /**
     * SampleController
     */
    module.controller("sampleController", function($scope, $timeout, Product) {
        // Productクラスのインスタンスを $scope にセットする
        $scope.product = new Product();
    });
})(angular.module("sampleModule"));
</script>

<!-- sampleModule テンプレート -->
<div ng-app="sampleModule">
    <!-- sampleController テンプレート -->
    <div ng-controller="sampleController" ng-cloak>
        <dl>
            <dt>商品名</dt>
            <dd><input type="text" name="name" ng-model="product.name"></dd>
            <dt>単価</dt>
            <dd><input type="number" name="price" ng-model="product.price"></dd>
            <dt>数量</dt>
            <dd><input type="number" name="qty" ng-model="product.qty"></dd>
            <dt>合計 <button ng-click="product.calcTotal()">計算する</button></dt>
            <dd>{{product.total | number}} 円</dd>
        </dl>
    </div>
</div>

目次
≪前の記事 2.モジュール、コントローラー、サービス≪改訂≫
≫次の記事 4.$watch≪改訂≫


5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?