Kaynak
Sözdizimi ve vm $scope object
kullanarak denetleyici oluşturma ve kullanma arasındaki fark“controller as”
$ Kapsam nesnesini kullanarak bir denetleyici oluşturma
Genellikle, aşağıdaki listede gösterildiği gibi $ kapsam nesnesini kullanarak bir denetleyici oluştururuz:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
Yukarıda, birbiriyle konuşan $ kapsam nesne denetleyicisini ve görünümünü kullanarak üç değişken ve bir davranışla AddController oluşturuyoruz. $ Kapsam nesnesi, verileri ve davranışı görünüme geçirmek için kullanılır. Görüntüyü ve denetleyiciyi birbirine yapıştırır.
Esasen $ kapsam nesnesi aşağıdaki görevleri gerçekleştirir:
Denetleyiciden görünüme veri aktarın
Denetleyiciden görünüme davranış geçirme
Denetleyiciyi ve görünümü birbirine yapıştırır
$ Kapsam nesnesi, bir görünüm değiştiğinde ve $ kapsam nesnesinin özellikleri değiştiğinde bir görünüm değiştirildiğinde değiştirilir
Verileri ve davranışı görünüme iletmek için bir $ kapsam nesnesine özellikler ekliyoruz. Denetleyicide $ kapsam nesnesini kullanmadan önce, onu denetleyici işlevine bağımlılık olarak geçirmemiz gerekir.
"Controller as" sözdizimi ve vm'yi kullanma
Denetleyiciyi sözdizimi olarak ve vm değişkenini aşağıdaki listede gösterildiği gibi kullanarak yukarıdaki denetleyiciyi yeniden yazabiliriz:
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;
}
});
Esasen bunu bir değişken vm'ye atıyoruz ve sonra buna bir özellik ve davranış ekliyoruz. Görünümde, denetleyiciyi sözdizimi olarak kullanarak AddVmController'a erişebiliriz. Bu, aşağıdaki listede gösterilmektedir:
<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>
Elbette sözdizimi olarak denetleyicide "vm" dışında başka bir ad kullanabiliriz. Başlık altında, AngularJS $ kapsam nesnesini oluşturur ve özellikleri ve davranışı ekler. Bununla birlikte, denetleyiciyi sözdizimi olarak kullanarak, denetleyicide kod çok temizdir ve görünümde yalnızca takma ad görünür.
Denetleyiciyi sözdizimi olarak kullanmak için bazı adımlar:
$ Kapsam nesnesi olmayan bir denetleyici oluşturun.
Bunu yerel bir değişkene atayın. Değişken ismini vm olarak tercih ettim, dilediğiniz ismi seçebilirsiniz.
Vm değişkenine veri ve davranış ekleyin.
Görünümde, denetleyiciyi sözdizimi olarak kullanarak denetleyiciye bir takma ad verin.
Takma ada herhangi bir isim verebilirsiniz. İç içe geçmiş denetleyicilerle çalışmadığım sürece vm kullanmayı tercih ederim.
Denetleyiciyi oluştururken, $ kapsam nesnesi yaklaşımını veya denetleyiciyi sözdizimi olarak kullanmanın doğrudan avantajları veya dezavantajları yoktur. Bu tamamen bir seçim meselesidir, ancak denetleyiciyi sözdizimi olarak kullanmak, denetleyicinin JavaScript kodunu daha okunabilir hale getirir ve bu bağlamla ilgili sorunları önler.
$ Kapsam nesne yaklaşımında iç içe geçmiş denetleyiciler
Aşağıdaki listede gösterildiği gibi iki denetleyicimiz var:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
"Yaş" özelliği her iki denetleyicinin içindedir ve görünümde bu iki denetleyici aşağıdaki listede gösterildiği gibi yuvalanabilir:
<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>
Gördüğünüz gibi, üst denetleyicinin age özelliğine erişmek için $ parent.age kullanıyoruz. Bağlam ayrımı burada çok net değil. Ancak denetleyiciyi sözdizimi olarak kullanarak, iç içe geçmiş denetleyicilerle daha zarif bir şekilde çalışabiliriz. Aşağıdaki listede gösterildiği gibi denetleyicilerimiz olduğunu varsayalım:
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";
});
Görünümde, bu iki denetleyici aşağıdaki listede gösterildiği gibi yuvalanabilir:
<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>
Sözdizimi olarak denetleyicide, daha okunabilir koda sahibiz ve üst özelliğe, $ parent sözdizimi kullanmak yerine üst denetleyicinin takma adı kullanılarak erişilebilir.
Bu yazıyı, denetleyiciyi sözdizimi veya $ kapsam nesnesi olarak kullanmak isteyip istemediğinizin tamamen sizin seçiminiz olduğunu söyleyerek bitireceğim. Her ikisinin de büyük bir avantajı veya dezavantajı yoktur, basitçe bağlam üzerinde kontrolünüz olan kontrolörle çalışmak, görünümdeki iç içe kontrolörlerdeki net ayrım göz önüne alındığında biraz daha kolay.