Angular คือ ตอนที่ 6 : ขอบเขต (Scopes)

  1. ทำความเข้าใจเกี่ยวกับขอบเขต (Scopes) ของ AngularJS
  2. ขอบเขต (Scopes) และตัวควบคุม (Controllers)
  3. ลำดับชั้น (Hierarchy) ของขอบเขต
  4. ขอบเขตวงจรชีวิต (Scope Lifecycles)
  5. วิธีการ (Methods) ขอบเขตและคุณสมบัติ (Properties)
  6. ขอบเขต (Scopes) และการผูกข้อมูลแบบสองทาง (Two-Way Data Binding)
  7. ขอบเขตและคำสั่ง (Directives)
  8. ขอบเขตและบริการ (Services)
  9. บทบาทของขอบเขตในการทดสอบ (Scope’s Role in Testing)

AngularJS ซึ่งเป็นเฟรมเวิร์กที่ใช้ JavaScript แบบโอเพ่นซอร์สที่พัฒนาโดย Google ได้กลายเป็นหนึ่งในเครื่องมือชั้นนำสำหรับการทำเว็บ Angular และทำแอพแบบไดนามิกหน้าเดียว หนึ่งในคุณสมบัติหลักที่ทำให้ AngularJS โดดเด่นคือการใช้ขอบเขต (Scopes) เมื่อนักพัฒนาพูดถึง AngularJS ขอบเขตเป็นส่วนหนึ่งของการสนทนาที่หลีกเลี่ยงไม่ได้ แต่ขอบเขตคืออะไรกันแน่? พวกเขาโต้ตอบกับส่วนอื่น ๆ ของเฟรมเวิร์ก AngularJS อย่างไร และพวกเขามีส่วนร่วมในการทำเว็บ Angular และทำแอพแบบไดนามิกอย่างไร ในบทความนี้ เราจะเจาะลึกคำถามเหล่านี้และอีกมากมาย

1. ทำความเข้าใจเกี่ยวกับขอบเขต (Scopes) ของ AngularJS

ใน AngularJS ขอบเขตคือวัตถุที่ทำหน้าที่เป็นรูปแบบแอปพลิเคชัน เป็นการเชื่อมต่อหรือเป็นกาวถ้าคุณต้องการระหว่างตัวควบคุมแอปพลิเคชันและมุมมอง ขอบเขตมีบทบาทในการจัดเตรียมบริบทที่นิพจน์ได้รับการประเมิน คุณสามารถมองว่ามันเป็นบริดจ์ที่ AngularJS ใช้เพื่อเชื่อมต่อข้อมูลโมเดลซึ่งกำหนดไว้ในคอนโทรลเลอร์ด้วยมุมมองที่แสดงต่อผู้ใช้

AngularJS เป็นไปตามสถาปัตยกรรม MVC (Model-View-Controller) ซึ่งโมเดลจะเก็บข้อมูล มุมมองจะแสดง และคอนโทรลเลอร์จะเชื่อมต่อทั้งสอง ในบริบทนี้ ขอบเขตทำหน้าที่เป็นส่วนหนึ่งของแบบจำลอง โดยจะเก็บข้อมูลและฟังก์ชันที่มุมมองสามารถเข้าถึงและแสดงได้ และตัวควบคุมสามารถจัดการได้

2. ขอบเขต (Scopes) และตัวควบคุม (Controllers)

ใน AngularJS ตัวควบคุมคือวัตถุ JavaScript ที่สร้างขึ้นโดยตัวสร้างวัตถุ JavaScript มาตรฐาน ประกอบด้วยแอตทริบิวต์/คุณสมบัติและฟังก์ชัน ตัวควบคุมแต่ละตัวมีขอบเขตที่เกี่ยวข้องกัน เมื่อคุณทำเว็บ Angular และทำแอพ คุณต้องกำหนดตัวควบคุมเพื่อจัดการข้อมูลและจัดการตรรกะทางธุรกิจ

ในตัวควบคุมของคุณ คุณสามารถสร้างคุณสมบัติในขอบเขต จากนั้นจึงสามารถเข้าถึงคุณสมบัติเหล่านี้ได้จากมุมมองของคุณ ตัวอย่างเช่น หากเราสร้างคุณสมบัติในขอบเขตภายในตัวควบคุมดังนี้:

app.controller('myController', function($scope) {
    $scope.message = 'Hello, World!';
});

จากนั้น เราสามารถเข้าถึงคุณสมบัติ ‘message’ นี้จากมุมมองของเราโดยใช้นิพจน์ เช่น:

<div ng-controller="myController">
    {{ message }}
</div>

นี่จะแสดง ‘Hello, World!’ บนหน้าเว็บ

3. ลำดับชั้น (Hierarchy) ของขอบเขต

สิ่งสำคัญอีกประการหนึ่งที่ต้องพิจารณาเมื่อทำเว็บ Angular และทำแอพคือลักษณะลำดับชั้นของขอบเขต เมื่อคุณสร้างคอนโทรลเลอร์ใหม่ AngularJS จะสร้างขอบเขตใหม่ที่เป็นลูกของขอบเขตพาเรนต์ ลำดับชั้นของขอบเขตนี้สร้างห่วงโซ่ขอบเขต

ลำดับชั้นนี้อนุญาตให้ขอบเขตย่อยเข้าถึงคุณสมบัติของขอบเขตหลัก อย่างไรก็ตาม ขอบเขตพาเรนต์ไม่สามารถเข้าถึงคุณสมบัติของขอบเขตย่อยได้ ในทำนองเดียวกัน ขอบเขตพี่น้องไม่สามารถเข้าถึงคุณสมบัติของกันและกันได้

4. ขอบเขตวงจรชีวิต (Scope Lifecycles)

ขอบเขตใน AngularJS ยังมีเหตุการณ์วงจรชีวิต เหตุการณ์เหล่านี้รวมถึงการสร้าง การลิงก์ การอัปเดต DOM การทำลาย และอื่นๆ ความเข้าใจอย่างถ่องแท้เกี่ยวกับวงจรชีวิตของขอบเขตสามารถช่วยอย่างมากในการทำเว็บ Angular และทำแอพแบบไดนามิกและมีประสิทธิภาพ

5. วิธีการ (Methods) ขอบเขตและคุณสมบัติ (Properties)

มีเมธอดและพร็อพเพอร์ตี้มากมายในอ็อบเจ็กต์ $scope ที่สามารถใช้เมื่อทำเว็บ Angular และทำแอพ บางส่วน ได้แก่ $watch(), $apply() และ $digest() วิธีการเหล่านี้ให้วิธีการสังเกตการเปลี่ยนแปลงค่าแบบจำลอง เผยแพร่ผ่านแอปพลิเคชัน และสะท้อนการเปลี่ยนแปลงในมุมมอง

6. ขอบเขต (Scopes) และการผูกข้อมูลแบบสองทาง (Two-Way Data Binding)

พลังของขอบเขตเปล่งประกายอย่างแท้จริงเมื่อผนวกเข้ากับการเชื่อมโยงข้อมูลแบบสองทางของ AngularJS ด้วยคุณสมบัตินี้ การเปลี่ยนแปลงใดๆ ในโมเดล (ขอบเขตในกรณีของเรา) จะได้รับการอัปเดตโดยอัตโนมัติในมุมมอง และการเปลี่ยนแปลงใดๆ ในมุมมองจะสะท้อนกลับมาในโมเดล การซิงโครไนซ์ระหว่างโมเดลและมุมมองนี้ทำให้โค้ดง่ายขึ้นและทำให้เฟรมเวิร์กมีประสิทธิภาพอย่างเหลือเชื่อเมื่อทำเว็บ Angular และทำแอพ

7. ขอบเขตและคำสั่ง (Directives)

คำสั่งเป็นอีกพื้นที่หนึ่งที่พลังของขอบเขตปรากฏชัด คำสั่งคือตัวทำเครื่องหมายบนองค์ประกอบ DOM (เช่น แอตทริบิวต์ ชื่อองค์ประกอบ ความคิดเห็น หรือคลาส CSS) ซึ่งบอกให้ AngularJS แนบลักษณะการทำงานเฉพาะกับองค์ประกอบ DOM นั้น หรือแม้แต่แปลงองค์ประกอบ DOM และองค์ประกอบย่อย

ใน AngularJS แต่ละคำสั่งจะสร้างขอบเขตใหม่ ขอบเขตที่สร้างขึ้นใหม่เป็นขอบเขตย่อยของขอบเขตพาเรนต์ (ในกรณีที่ตัวควบคุมใหม่ถูกสร้างอินสแตนซ์) หรือขอบเขตแยก ขอบเขตที่แยกเป็นขอบเขตที่ไม่ได้สืบทอดต้นแบบจากขอบเขตหลัก สิ่งนี้มีประโยชน์สำหรับการสร้างส่วนประกอบที่ใช้ซ้ำได้ ซึ่งไม่ควรแก้ไขข้อมูลในขอบเขตพาเรนต์โดยไม่ได้ตั้งใจ

ตัวอย่างเช่น หากเราสร้างคำสั่งดังต่อไปนี้:

app.directive('myDirective', function() {
    return {
        restrict: 'E',
        scope: {},
        template: '<div>{{ message }}</div>',
        link: function(scope, element, attrs) {
            scope.message = 'Hello from the directive!';
        }
    };
});

และใช้ใน HTML ของเราดังนี้:

<my-directive></my-directive>

ข้อความ ‘Hello from the directive!’ จะแสดงบนเว็บเพจ แสดงว่าคำสั่งนั้นมีขอบเขตแยกของมันเอง

8. ขอบเขตและบริการ (Services)

ในโลกของ AngularJS บริการคือออบเจกต์หรือฟังก์ชันแบบซิงเกิลตันที่ดำเนินงานเฉพาะซึ่งพบได้ทั่วไปในเว็บแอป บริการต่างๆ มักจะถูกแทรกเข้าไปในตัวควบคุม คำสั่ง และบริการอื่นๆ ด้วยระบบการฉีดขึ้นต่อกันของ Angular ทำให้เป็นเครื่องมือพื้นฐานในการทำเว็บ Angular และทำแอพ

แม้ว่าบริการและขอบเขตจะมีบทบาทที่แตกต่างกัน แต่การทำความเข้าใจว่าพวกเขาโต้ตอบกันนั้นมีความสำคัญอย่างไร โดยทั่วไป ควรใช้บริการสำหรับการสื่อสารข้ามคอนโทรลเลอร์และสำหรับการห่อหุ้มและนำโค้ดกลับมาใช้ใหม่ ในขณะที่ขอบเขตจะใช้สำหรับการผูกข้อมูล – การสื่อสารระหว่างคอนโทรลเลอร์และมุมมอง

9. บทบาทของขอบเขตในการทดสอบ (Scope’s Role in Testing)

การทดสอบเป็นส่วนสำคัญของการทำเว็บ Angular และทำแอพ มาพร้อมกับกรอบการทดสอบที่มีประสิทธิภาพซึ่งออกแบบโดยคำนึงถึงขอบเขต เมื่อส่วนประกอบการทดสอบหน่วย เช่น ตัวควบคุมและบริการ สามารถใช้บริการ $rootScope แบบฉีดได้เพื่อสร้างขอบเขตใหม่สำหรับวัตถุประสงค์ในการทดสอบ

describe('Controller: MainCtrl', function () {
    var $scope;

    beforeEach(inject(function ($rootScope, $controller) {
        $scope = $rootScope.$new();
        $controller('MainCtrl', {
            $scope: $scope
        });
    }));

    // write your test cases here
});

ในตัวอย่างนี้ ก่อนเรียกใช้การทดสอบแต่ละครั้ง เราจะแทรกบริการ $rootScope และ $controller สร้างขอบเขตใหม่ และสร้างอินสแตนซ์ตัวควบคุม MainCtrl ด้วยขอบเขตใหม่ การตั้งค่านี้ช่วยให้เราสามารถทดสอบผลกระทบของคอนโทรลเลอร์ต่อขอบเขตได้


ขอบเขตมีบทบาทสำคัญใน AngularJS พวกเขาเป็นช่องทางที่เชื่อมต่อโมเดลและมุมมอง ทำให้พวกเขาจำเป็นต้องเข้าใจสำหรับทุกคนที่ต้องการทำเว็บ Angular และทำแอพไดนามิกหน้าเดียว

ไม่ว่าคุณกำลังทำเว็บ Angular และทำแอพแรก หรือคุณเป็นนักพัฒนาที่มีประสบการณ์ในการปรับแต่งงานฝีมือของคุณ ความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับขอบเขตจะช่วยให้คุณมีเครื่องมือมากขึ้นในการแก้ปัญหา และวิธีการเพิ่มเติมในการจัดโครงสร้างแอปพลิเคชันของคุณอย่างมีประสิทธิภาพ

ดังที่เราได้เห็นแล้ว ขอบเขตของ AngularJS เป็นคุณสมบัติที่สำคัญของเฟรมเวิร์ก เชื่อมโยงตัวควบคุมและมุมมอง และทำงานอย่างใกล้ชิดกับส่วนประกอบอื่นๆ เช่น คำสั่งและบริการ ความเข้าใจแนวคิดของขอบเขตและบทบาทใน AngularJS และวิธีการโต้ตอบกับส่วนอื่นๆ ของเฟรมเวิร์กเป็นขั้นตอนสำคัญในการทำเว็บ Angular และทำแอพที่มีประสิทธิภาพ


Angular คืออะไร (AngularJS)

Angular คือ ตอนที่ 5 : ตัวกรอง (Filters)
Angular คือ ตอนที่ 7 : บริการ (Services)