$routeProviderのresolveにServiceを指定しControllerにデータを注入する

resolveを利用してControllerに処理が移動する前にバックエンドからデータを取得しておく

その結果Controllerをよりシンプルに書ける

AngularJSの$routeProviderを中心にコードを構成してみると、よりサーバサイドのMVCのようにAngularJSを理解することができる。

$routeProviderは、app.jsというアプリケーション本体に記述している。

$routeProvider
.when('/posts', {
	templateUrl: 'app/partials/posts.html', // view
	controller: 'TestCtrl', // Controller
	resolve: {
		'GetServiceData':function(GetService){
			return GetService.promise;
		} // Model
	}
})
  • templateUrl → View
  • controller → Controller
  • resolve → Model

resolveのことを調べていて、AngularJSとして正しいかは分からないが、イメージとしてはサーバサイドのMVCに似た構成にすることができる。resolveにServiceを指定することにより、Controllerに対してバックエンド側のデータを注入することが可能になる。

上のコードのGetServiceは以下のようになる。

ajs.factory('GetService', function($http, $rootScope) {
	var d = null;
	var promise = $http.get($rootScope.appUrl + '/recipes.json').success(function (data) {
		d = data;
	});

	return {
		promise:promise,
		getdata: function () {
			return d;
		}
	};
});

GetServiceでは、バックエンドのRESTful APIからデータを取得している。そして、resolveにGetServiceを指定しておくことで、Controller内では、意識することなくGetServiceのデータが利用できる。その結果Controllerを完結に書くことができる。

ajs.controller('TestCtrl', function(GetService, $scope) {
        $scope.recipes = GetService.getdata().recipes;
});

Controller内で$scope.recipesにバックエンド側のデータを格納すればView側でそのデータを表示することができる。

<tr ng-repeat="e in recipes">
        <td>{{e.Recipe.id}}</td>
        <td>{{e.Recipe.title}}</td>
        <td>{{e.Recipe.body}}</td>
        <td>{{e.Recipe.created|date:'short'}}</td>
</tr>

あらかじめ取得するデータが決まっている場合には、$routeProviderのresolveを利用することで管理しやすいコードを書くことができる。

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

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

$routeProviderのresolveにServiceを指定しControllerにデータを注入するの記事にコメントを投稿