ทั้งสองมีประโยชน์ ก่อนอื่นมีประวัติ ...
$ scope เป็นเทคนิค "คลาสสิค" ในขณะที่ "controller as" เป็นรุ่นล่าสุดมากขึ้น (เป็นเวอร์ชั่น 1.2.0 อย่างเป็นทางการแม้ว่าจะปรากฏในรุ่นก่อนวางจำหน่ายที่ไม่เสถียรก่อนหน้านี้)
ทั้งสองทำงานได้ดีอย่างสมบูรณ์และคำตอบเดียวที่ผิดคือการผสมในแอพเดียวกันโดยไม่มีเหตุผลที่ชัดเจน ตรงไปตรงมาการผสมมันจะได้ผล แต่มันจะเพิ่มความสับสน ดังนั้นเลือกหนึ่งและหมุนด้วย สิ่งที่สำคัญที่สุดคือการสอดคล้อง
อันไหน? ขึ้นอยู่กับคุณ มีตัวอย่างอีกมากมายที่มีขอบเขต $ แต่ "controller as" กำลังหยิบขึ้นมาเช่นกัน ดีกว่าอีกไหม? ที่เป็นที่ถกเถียงกัน ดังนั้นคุณจะเลือกอย่างไร
ความสบายใจ
ฉันชอบ "คอนโทรลเลอร์เป็น" เพราะฉันชอบซ่อนขอบเขต $ และเปิดเผยสมาชิกจากคอนโทรลเลอร์ไปยังมุมมองผ่านวัตถุตัวกลาง ด้วยการตั้งค่านี้ * ฉันสามารถแสดงสิ่งที่ฉันต้องการเปิดเผยจากคอนโทรลเลอร์ไปยังมุมมอง คุณสามารถทำได้ด้วย $ scope เหมือนกันฉันแค่ต้องการใช้จาวาสคริปต์มาตรฐานสำหรับสิ่งนี้ ในความเป็นจริงฉันรหัสมันเช่นนี้
var vm = this;
vm.title = 'some title';
vm.saveData = function(){ ... } ;
return vm;
สิ่งนี้ทำให้ฉันรู้สึกสะอาดและทำให้ฉันเห็นสิ่งที่ถูกมองเห็นได้ง่ายขึ้น โปรดสังเกตว่าฉันตั้งชื่อตัวแปรที่ฉันส่งคืน "vm" ซึ่งย่อมาจาก viewmodel นั่นเป็นเพียงการประชุมของฉัน
ด้วย $ scope ฉันสามารถทำสิ่งเดียวกันดังนั้นฉันจึงไม่เพิ่มหรือเบี่ยงเบนด้วยเทคนิค
$scope.title = 'some title';
$scope.saveData = function() { ... };
ดังนั้นมันขึ้นอยู่กับคุณที่นั่น
การฉีด
ด้วย $ scope ฉันต้องการฉีด $ scope เข้าไปในคอนโทรลเลอร์ ฉันไม่ต้องทำสิ่งนี้กับคอนโทรลเลอร์ยกเว้นว่าฉันต้องการเหตุผลอื่น (เช่น $ broadcast หรือ watches แม้ว่าฉันจะพยายามหลีกเลี่ยงนาฬิกาในคอนโทรลเลอร์)
อัปเดต
ฉันเขียนบทความนี้เกี่ยวกับ 2 ตัวเลือก:
http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/