ソース
を使用したコントローラの作成$scope object
と“controller as”
構文およびvmの使用の違い
$ scopeオブジェクトを使用してコントローラーを作成する
通常、以下のリストに示すように、$ scopeオブジェクトを使用してコントローラーを作成します。
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
上記では、$ scopeオブジェクトコントローラーとビューを使用して、3つの変数と1つの動作を持つAddControllerを作成しています。$ scopeオブジェクトは、データと動作をビューに渡すために使用されます。ビューとコントローラーを接着します。
基本的に、$ scopeオブジェクトは次のタスクを実行します。
コントローラからビューにデータを渡す
コントローラーからビューに動作を渡す
コントローラーを接着して一緒に表示
$ scopeオブジェクトはビューが変更されると変更され、ビューは$ scopeオブジェクトのプロパティが変更されると変更されます
プロパティを$ scopeオブジェクトにアタッチして、データと動作をビューに渡します。コントローラーで$ scopeオブジェクトを使用する前に、依存関係としてコントローラー関数に渡す必要があります。
「controller as」構文とvmを使用する
以下のリストに示すように、構文としてコントローラーとvm変数を使用して、上記のコントローラーを書き換えることができます。
myApp.controller("AddVMController", function () {
var vm = this;
vm.number1 = undefined;
vm.number2=undefined;
vm.result =undefined;
vm.add = function () {
vm.result = vm.number1 + vm.number2;
}
});
基本的に、これを変数vmに割り当ててから、プロパティと動作をそれに関連付けます。ビューでは、コントローラーを構文として使用してAddVmControllerにアクセスできます。これは以下のリストに示されています。
<div ng-controller="AddVMController as vm">
<input ng-model="vm.number1" type="number" />
<input ng-model="vm.number2" type="number" />
<button class="btn btn-default" ng-click="vm.add()">Add</button>
<h3>{{vm.result}}</h3>
</div>
もちろん、構文としてコントローラーで「vm」以外の名前を使用できます。内部で、AngularJSは$ scopeオブジェクトを作成し、プロパティと動作を関連付けます。ただし、コントローラーを構文として使用することで、コードはコントローラーで非常にクリーンになり、エイリアス名のみがビューに表示されます。
コントローラを構文として使用するためのいくつかの手順を次に示します。
$ scopeオブジェクトなしでコントローラーを作成します。
これをローカル変数に割り当てます。私はvmとして変数名を優先しました。任意の名前を選択できます。
データと動作をvm変数にアタッチします。
ビューで、コントローラーを構文として使用して、コントローラーにエイリアスを指定します。
エイリアスには任意の名前を付けることができます。ネストされたコントローラーを使用していない限り、私はvmを使用することを好みます。
コントローラーを作成する際、$ scopeオブジェクトのアプローチまたはコントローラーを構文として使用することの直接的な利点や欠点はありません。これは純粋に選択の問題ですが、コントローラを構文として使用すると、コントローラのJavaScriptコードが読みやすくなり、このコンテキストに関連する問題が防止されます。
$ scopeオブジェクトアプローチでネストされたコントローラー
以下のリストに示すように、2つのコントローラーがあります。
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
プロパティ「age」は両方のコントローラーの内部にあり、ビューではこれらの2つのコントローラーを次のリストに示すようにネストできます。
<div ng-controller="ParentController">
<h2>Name :{{name}} </h2>
<h3>Age:{{age}}</h3>
<div ng-controller="ChildController">
<h2>Parent Name :{{name}} </h2>
<h3>Parent Age:{{$parent.age}}</h3>
<h3>Child Age:{{age}}</h3>
<h3>Country:{{country}}</h3>
</div>
</div>
ご覧のとおり、親コントローラーのageプロパティにアクセスするには、$ parent.ageを使用しています。ここではコンテキストの分離はあまり明確ではありません。しかし、コントローラーを構文として使用すると、ネストされたコントローラーをよりエレガントな方法で操作できます。以下のリストに示すようなコントローラーがあるとします。
myApp.controller("ParentVMController", function () {
var vm = this;
vm.name = "DJ";
vm.age = 32;
});
myApp.controller("ChildVMController", function () {
var vm = this;
vm.age = 22;
vm.country = "India";
});
ビューでは、以下のリストに示すように、これら2つのコントローラーをネストできます。
<div ng-controller="ParentVMController as parent">
<h2>Name :{{parent.name}} </h2>
<h3>Age:{{parent.age}}</h3>
<div ng-controller="ChildVMController as child">
<h2>Parent Name :{{parent.name}} </h2>
<h3>Parent Age:{{parent.age}}</h3>
<h3>Child Age:{{child.age}}</h3>
<h3>Country:{{child.country}}</h3>
</div>
</div>
構文としてのコントローラーには、より読みやすいコードがあり、$ parent構文を使用する代わりに、親コントローラーのエイリアス名を使用して親プロパティにアクセスできます。
コントローラーを構文として使用するか、$ scopeオブジェクトとして使用するかは純粋にあなたの選択であると言って、この投稿を締めくくります。ビューにネストされたコントローラーが明確に分かれていることを考えると、コンテキストに対して制御できる構文としてのコントローラーの方が扱いやすいという点で、どちらにも大きな利点や欠点はありません。