AngularJS - スコープ: アプリケーションの接着剤を理解する
こんにちは、未来のAngularJS魔术師さんたち!今日は、AngularJSのスコープの世界に興味深い旅をすることになります。プログラミングが初めてであっても心配しないでください。私はあなたの親切なガイドとして、すべてをステップバイステップで説明します。コーヒー(またはあなたの好みの茶)を飲みながら、一緒に潜りましょう!
AngularJSでのスコープとは?
まず最初に、AngularJSでのスコープとは何かを確認しましょう。家を建てていると考えてみてください。スコープはあなたの家の基盤のようなものです。データや関数が存在する場所で、HTML(ビュー)とJavaScript(コントローラ)を結びつける役割を果たします。
簡単な例を見てみましょう:
<div ng-app="myApp" ng-controller="myCtrl">
<h1>{{message}}</h1>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.message = "Hello, AngularJS!";
});
</script>
この例では、$scope
が私たちのスコープオブジェクトです。message
プロパティを設定し、HTML内で{{message}}
を使って表示します。魔法のようですね?
スコープの継承
次に、少し高度な話題に進みましょう。スコープの継承についてです。データの家系図のようなものです!
スコープの継承とは?
AngularJSでは、スコープは親スコープから継承することができます。まるで子が親から特性を受け継ぐようなものです。これは、現在のスコープにプロパティが見つからない場合、AngularJSは親スコープ、さらに祖父母スコープと順に探しに行くことを意味します。
実際に見てみましょう:
<div ng-app="myApp" ng-controller="parentCtrl">
親: {{message}}
<div ng-controller="childCtrl">
子: {{message}}
</div>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('parentCtrl', function($scope) {
$scope.message = "I'm the parent!";
});
app.controller('childCtrl', function($scope) {
// 子スコープは親から継承
});
</script>
この例では、親と子の両方が「I'm the parent!」を表示します。なぜなら、子スコープは親スコープから継承しているからです。
継承されたプロパティのオーバーライド
しかし、子が反発し、自分のメッセージを持ちたい場合どうでしょうか?問題ありません!継承されたプロパティをオーバーライドできます:
<div ng-app="myApp" ng-controller="parentCtrl">
親: {{message}}
<div ng-controller="childCtrl">
子: {{message}}
</div>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('parentCtrl', function($scope) {
$scope.message = "I'm the parent!";
});
app.controller('childCtrl', function($scope) {
$scope.message = "I'm the child!";
});
</script>
今度は、親が「I'm the parent!」を表示し、子が「I'm the child!」を表示します。子は無事に独立を主張しました!
スコープの家系図の例
これらすべてをより複雑な例にまとめましょう。スコープの家系図を作成します:
<div ng-app="familyApp" ng-controller="grandparentCtrl">
祖父母: {{message}}
<div ng-controller="parentCtrl">
親: {{message}}
<div ng-controller="childCtrl">
子: {{message}}
<div ng-controller="grandchildCtrl">
孫: {{message}}
</div>
</div>
</div>
</div>
<script>
var app = angular.module('familyApp', []);
app.controller('grandparentCtrl', function($scope) {
$scope.message = "I'm the grandparent!";
});
app.controller('parentCtrl', function($scope) {
// 祖父母から継承
});
app.controller('childCtrl', function($scope) {
$scope.message = "I'm the child!";
});
app.controller('grandchildCtrl', function($scope) {
// 子から継承
});
</script>
出力
このコードを実行すると、以下のようになります:
祖父母: I'm the grandparent!
親: I'm the grandparent!
子: I'm the child!
孫: I'm the child!
これを分解すると:
- 祖父母が初期メッセージを設定します。
- 親はメッセージを設定しないため、祖父母から継承します。
- 子は自分のメッセージを設定し、継承されたものをオーバーライドします。
- 孫はメッセージを設定しないため、即座の親(子)から継承します。
スコープメソッド
スコープはデータを保存するだけでなく、メソッドを含むこともできます!以下はいくつかの一般的なスコープメソッドの表です:
メソッド | 説明 |
---|---|
$watch() | watched expressionが変更されたときに呼び出されるリスナーを登録 |
$apply() | ディジェストサイクルを手動で開始 |
$on() | イベントリスナーを登録 |
$emit() | スコープ階層を上方向にイベントを送信 |
$broadcast() | 全ての子スコープにイベントを下方に送信 |
以下に$watch()
の例を見てみましょう:
<div ng-app="watchApp" ng-controller="watchCtrl">
<input ng-model="name">
<p>{{greeting}}</p>
</div>
<script>
var app = angular.module('watchApp', []);
app.controller('watchCtrl', function($scope) {
$scope.name = 'World';
$scope.greeting = 'Hello, ' + $scope.name + '!';
$scope.$watch('name', function(newValue, oldValue) {
$scope.greeting = 'Hello, ' + newValue + '!';
});
});
</script>
この例では、$watch()
を使って名前が変更されたときに挨拶を更新しています。インプットフィールドに何かを入力すると、挨拶がリアルタイムで更新されます!
結論
そして、ここまでがAngularJSのスコープに関する whirlwind tour です!スコープとは何か、どうやって互いに継承するか、さらにスコープメソッドのような高度な概念にも触れました。
忘れないでください、スコープはAngularJSアプリケーションを結びつける接着剤です。データはJavaScriptからHTMLに流れ、HTMLでのユーザー操作がJavaScriptを更新する方法です。
AngularJSの旅を続ける中で、スコープを扱う機会がたくさんあります。しかし、心配しないでください。練習を重ねることで自然に身につきます。すぐにプロのカ trick ができるようになるでしょう!
codingを続け、学びを続け、そして何より楽しみましょう!AngularJSの世界は広大で興味深いもので、あなたはその第一歩を踏み出しました。次回まで、happy coding!
Credits: Image by storyset