SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

AngularJSではじめるJavaScriptフレームワーク開発スタイル

AngularJSの強力なデータバインディングの肝となる! スコープを理解して、独特な開発スタイルを自分のものにしよう

AngularJSではじめるJavaScriptフレームワーク開発スタイル 第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

スコープのイベント

 続いてスコープのイベント処理について説明します。イベントは、直接参照できないスコープや、一度に複数のスコープとデータを連携したい場合になどに使えます。

 サンプルアプリケーションでは、データの追加や削除があった場合に一覧データを更新するために使っています。

 AngularJSでは、$scopeのイベントを処理するために、表2のような3つのメソッドが用意されています。

表2:スコープ間連携の為のイベント関数
関数名 説明
$scope.broadcast(name , ...args ) 自分自身から下位(子)方向にイベントを通知する
$scope.emit(name , ...args ) 自分自身から上位(親)方向にイベントを通知する
$scope.on ( name , listener ) イベントを受け取った際に処理をする

 イベント伝播には方向があり、先ほど紹介したスコープの親子関係に従い伝播するようになっています。それらの伝播の方向は図4のようになります。

図4:AngularJSのイベント
図4:AngularJSのイベント

 リスト7は、この機能を利用しほかのコントローラに対して処理イベントを通知するためのサンプルコードです。

リスト7 controllers.jsの抜粋(スコープを利用したイベント)
module.controller('listController',function($scope){
    // : 省略
    $scope.$on('changeItems',function(){  // (1) 'changeItem'イベントを受け取る
        alert('一覧が更新されました');
    });
});
module.controller('addController',function($scope){
    $scope.addItem = function(){
        // : 省略
        $scope.$root.$broadcast('changeItems');  (2) // 'changeItem'イベントを通知する
        // : 省略
    }
});

 (1)では、一覧表示であるlistControllerでの$scopeオブジェクトに対して、"changeItems"イベントを取得した際に一覧情報を更新します。ただし、現在はalert関数を実行していますが、実装は次回説明します。

 (2)では、データを追加するaddControllerのaddItemメソッドの中で、$rootScope($cope.$root)に対して、$broadcastメソッドを使ってイベントを発生させます。$broadcastメソッドは親から子へと伝播していきますので、基本的にはすべてのコントローラの$scopeで取得可能になります。

最後に

 今回は、AngularJSでのデータ連携の肝となるスコープについて説明を行いました。素のJavaScriptコードの記述に慣れていると、AngularJSのデータバインディングなどは多少の不思議さを感じる部分があります。

 筆者も、既存のJavaScriptのライブラリと組み合わせてAngularJSを使ったときに、この問題にぶつかりました。AngularJSのみで作成する簡単なサンプルでは問題なく実装ができても、実際の利用となると使えない原因の一つとなりえる機能だと思います。従って、よくわからなくても何となくできてしまう部分があるかもしれません。

 それこそがフレームワークを使う上でのメリットの1つでもあります。同時に、フレームワークの弊害でもあります。多少気持ちが悪いかも知れませんが、その部分を気にとめながらもそのまま利用してみてください。気になっている部分の霧が晴れたときには、さらにそのフレームワークの奥深さや便利さが別の視点で理解できるようになることと思います。

 次回は、実際のデータ管理を行うサービスの説明と実装をしていきます。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
AngularJSではじめるJavaScriptフレームワーク開発スタイル連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8311 2014/12/22 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング