controller内のModel処理をserviceとして分離する

AngularJSでバックエンド連携部分をServiceにまとめる

controllerからAjaxリクエスト部分を除外する

AngularJSにはServiceという概念がある。

AngularJSからRestfulなリクエストを送信のエントリーでは、最終的に

  • app.js
  • controllers.js

を分離して、MVCを意識したRestfulなサンプルアプリを作ってみた。そのエントリーの中で、controllers.jsは以下のようになった。

(function() {
    var ajs = angular.module('myApp.controllers', []);
    ajs.controller('AppCtrl', function($scope, $rootScope, $http) {
        $rootScope.appUrl = "http://restful-cakephp.local";
    });
 
    ajs.controller('GetRequestCtrl', function($scope, $rootScope, $http) {
        var load = function() {
            $http.get($rootScope.appUrl + '/recipes.json')
                    .success(function(data, status, headers, config) {
                            $scope.recipes = data.recipes;
                    });
        }
 
        load();
    });
}());

controller内でAPIへの接続、及びデータの取得を行っている。本エントリーでは、上のコードからバックエンド連携部分をServiceとして分離する。

Restful APIとの連携部分としてServiceを書く。

(function () {
	var ajs = angular.module('myApp.services', []);

	ajs.factory('GetService', function($http, $rootScope) {
		var GetService = {
			async: function() {
			  
				var promise = $http.get($rootScope.appUrl + '/recipes.json')
					.success(function(data, status, headers, config) {
						return data;
					});
			
				return promise;
			}
		};
		
		return GetService;
	});

}());

上のコードを

services.js

として保存する。バックエンドAPIとの連携部分のみをserviceに括り出したので、controllerからserviceを利用するコードを書く。

    ajs.controller('GetRequestCtrl', function(GetService, $scope) {
		GetService.async().then(function(d) {
			$scope.recipes = d.data.recipes;
		});
    });

GetRequestCtrlコントローラは上のようにシンプルになった。app.jsでserviceモジュールの読み込み設定も必要。

    var ajs = angular.module('myApp', [
		'ngRoute',
		'myApp.services',
		'myApp.controllers'
	]);

controllerとservice(Model)を分離することができた。serviceをmvcのModelとして利用しコントローラからバックエンド連携やビジネスロジックを追い出すことで、コントローラが巨大化することを防ぐことができる。

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

controller内のModel処理をserviceとして分離するの記事にコメントを投稿