แหล่ง
ความแตกต่างระหว่างการสร้างคอนโทรลเลอร์โดยใช้$scope object
และการใช้“controller as”
ไวยากรณ์และ vm
การสร้างคอนโทรลเลอร์โดยใช้วัตถุ $ ขอบเขต
โดยปกติเราจะสร้างคอนโทรลเลอร์โดยใช้วัตถุ $ ขอบเขตดังที่แสดงในรายการด้านล่าง:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
ด้านบนเรากำลังสร้าง AddController ที่มีตัวแปรสามตัวและหนึ่งพฤติกรรมโดยใช้ตัวควบคุมวัตถุ $ ขอบเขตและมุมมองซึ่งพูดคุยกัน วัตถุ $ ขอบเขตใช้เพื่อส่งผ่านข้อมูลและพฤติกรรมไปยังมุมมอง มันรวมมุมมองและตัวควบคุมเข้าด้วยกัน
โดยพื้นฐานแล้ววัตถุ $ ขอบเขตจะทำงานต่อไปนี้:
ส่งผ่านข้อมูลจากคอนโทรลเลอร์ไปยังมุมมอง
ส่งผ่านพฤติกรรมจากคอนโทรลเลอร์ไปยังมุมมอง
กาวคอนโทรลเลอร์และดูเข้าด้วยกัน
วัตถุ $ ขอบเขตได้รับการแก้ไขเมื่อมุมมองเปลี่ยนไปและมุมมองถูกแก้ไขเมื่อคุณสมบัติของวัตถุ $ ขอบเขตเปลี่ยนไป
เราแนบคุณสมบัติเข้ากับวัตถุ $ ขอบเขตเพื่อส่งผ่านข้อมูลและพฤติกรรมไปยังมุมมอง ก่อนที่จะใช้วัตถุ $ ขอบเขตในคอนโทรลเลอร์เราจำเป็นต้องส่งผ่านมันในฟังก์ชันคอนโทรลเลอร์เป็นการอ้างอิง
การใช้ไวยากรณ์ "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 สร้างวัตถุ $ ขอบเขตและแนบคุณสมบัติและพฤติกรรม อย่างไรก็ตามด้วยการใช้คอนโทรลเลอร์เป็นไวยากรณ์โค้ดจะสะอาดมากที่คอนโทรลเลอร์และมีเพียงชื่อนามแฝงเท่านั้นที่มองเห็นได้บนมุมมอง
ต่อไปนี้เป็นขั้นตอนบางประการในการใช้คอนโทรลเลอร์เป็นไวยากรณ์:
สร้างคอนโทรลเลอร์โดยไม่มีวัตถุ $ ขอบเขต
กำหนดสิ่งนี้ให้กับตัวแปรโลคัล ฉันต้องการชื่อตัวแปรเป็น vm คุณสามารถเลือกชื่อใดก็ได้ที่คุณต้องการ
แนบข้อมูลและพฤติกรรมกับตัวแปร vm
ในมุมมองให้นามแฝงแก่คอนโทรลเลอร์โดยใช้คอนโทรลเลอร์เป็นไวยากรณ์
คุณสามารถตั้งชื่อให้กับนามแฝงใดก็ได้ ฉันชอบใช้ vm เว้นแต่ฉันจะไม่ทำงานกับตัวควบคุมที่ซ้อนกัน
ในการสร้างตัวควบคุมไม่มีข้อดีหรือข้อเสียโดยตรงของการใช้วิธีวัตถุ $ ขอบเขตหรือตัวควบคุมเป็นไวยากรณ์ เป็นเรื่องของทางเลือกอย่างแท้จริงอย่างไรก็ตามการใช้คอนโทรลเลอร์เป็นไวยากรณ์ทำให้โค้ด JavaScript ของคอนโทรลเลอร์สามารถอ่านได้มากขึ้นและป้องกันปัญหาใด ๆ ที่เกี่ยวข้องกับบริบทนี้
ตัวควบคุมที่ซ้อนกันในแนวทางวัตถุ $ ขอบเขต
เรามีตัวควบคุมสองตัวตามที่แสดงในรายการด้านล่าง:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
คุณสมบัติ "อายุ" อยู่ในตัวควบคุมทั้งสองตัวและในมุมมองตัวควบคุมทั้งสองนี้สามารถซ้อนกันได้ดังแสดงในรายการด้านล่าง:
<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>
อย่างที่คุณเห็นในการเข้าถึงคุณสมบัติอายุของตัวควบคุมหลักเรากำลังใช้ $ 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";
});
ในมุมมองตัวควบคุมทั้งสองนี้สามารถซ้อนกันได้ดังแสดงในรายการด้านล่าง:
<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
ฉันจะสรุปโพสต์นี้โดยบอกว่าเป็นตัวเลือกของคุณล้วนๆไม่ว่าคุณจะต้องการใช้คอนโทรลเลอร์เป็นไวยากรณ์หรือวัตถุ $ ขอบเขต ไม่มีข้อได้เปรียบหรือข้อเสียอย่างมากเพียงแค่ว่าคอนโทรลเลอร์เป็นไวยากรณ์ที่คุณควบคุมบริบทนั้นทำงานได้ง่ายกว่าเล็กน้อยเนื่องจากการแยกที่ชัดเจนในตัวควบคุมที่ซ้อนกันบนมุมมอง