นิพจน์ใน AngularJS: อาร์เรย์, อ็อบเจ็กต์, $eval, สตริง

⚡ สรุปอย่างชาญฉลาด

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

  • 🧩 ไวยากรณ์การผูกข้อมูล: Double วงเล็บปีกกาจะแสดงค่าในตำแหน่งที่นิพจน์อยู่ ทำให้ได้ผลลัพธ์เช่นเดียวกับคำสั่ง ng-bind
  • 🔢 ประเภทที่รองรับ: Numbersสตริง Javaอ็อบเจ็กต์สคริปต์ที่เข้าถึงด้วยสัญกรณ์จุด และอาร์เรย์ที่เข้าถึงด้วยดัชนี ล้วนประเมินผลได้อย่างถูกต้อง
  • 🏷️ ตัวแปรแบบอินไลน์: คำสั่ง ng-init จะประกาศตัวแปรระดับวิวที่นิพจน์สามารถอ่านได้โดยไม่ต้องมีคอนโทรลเลอร์
  • 🛡️ การประเมินที่ให้อภัย: คุณสมบัติที่ไม่ได้กำหนดจะส่งคืนค่า undefined แทนที่จะโยนข้อผิดพลาด ReferenceError ออกมาตรงๆ Javaสคริปต์จะเพิ่มระดับขึ้น
  • ???? ขีดจำกัดที่เข้มงวด: ลูป, ข้อยกเว้น, การประกาศฟังก์ชัน, นิพจน์ปกติ และตัวดำเนินการคอมมาและตัวดำเนินการ void ไม่สามารถใช้งานได้
  • ⚙️ การประเมินตัวควบคุม: $scope.$eval จะประเมินสตริงนิพจน์ในโค้ดคอนโทรลเลอร์และแสดงผลลัพธ์ไปยังวิว
  • ⚠️ สถานะการสนับสนุน: AngularJS สิ้นสุดการสนับสนุนเมื่อวันที่ 31 ธันวาคม 2021 และจะไม่ได้รับการแก้ไขช่องโหว่ด้านความปลอดภัยอีกต่อไป

นิพจน์ AngularJS

AngularJS Expression คืออะไร?

นิพจน์คือตัวแปรที่เขียนอยู่ภายในวงเล็บปีกกาคู่ {{ }}พวกมันถูกใช้งานอย่างแพร่หลายใน AngularJS และปรากฏให้เห็นในบทเรียนก่อนหน้านี้ในชุดนี้

⚠️ ประกาศเกี่ยวกับการสนับสนุน: AngularJS มาถึงแล้ว สิ้นสุดชีวิตเมื่อวันที่ 31 ธันวาคม 2021 และจะไม่ได้รับการแก้ไขข้อบกพร่องหรือการแก้ไขด้านความปลอดภัยเพิ่มเติมอีกต่อไป ไวยากรณ์ด้านล่างยังคงถูกต้องสำหรับการบำรุงรักษาแอปพลิเคชัน AngularJS 1.x ที่มีอยู่ โครงการใหม่ควรใช้เวอร์ชันที่ทันสมัยกว่า เชิงมุมซึ่งวงเล็บสำหรับการแทรกค่ายังคงมีอยู่ แต่ ng-init และ $eval ทำไม่ได้

อธิบายการใช้ Expression ใน AngularJS พร้อมยกตัวอย่าง

นิพจน์ใน AngularJS จะเขียนอยู่ภายในวงเล็บปีกกาคู่ ดังนี้ {{expression}}.

ไวยากรณ์: ตัวอย่างง่ายๆ ของการแสดงออกคือ {{5 + 6}}.

นิพจน์ใน AngularJS ผูกข้อมูลเข้ากับ HTML ในลักษณะเดียวกับคำสั่ง ng-bind และ AngularJS จะแสดงข้อมูลในตำแหน่งที่วางนิพจน์ไว้อย่างแม่นยำ

ในตัวอย่างนี้ เราแสดงการบวกตัวเลขอย่างง่ายในรูปแบบนิพจน์

นิพจน์ AngularJS

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

    <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

    <h1>Guru99 Global Event</h1>

    <div ng-app="">
        Addition : {{6+9}}
    </div>

</body>
</html>

Code คำอธิบาย:

  1. คำสั่ง ng-app ว่างเปล่า ซึ่งหมายความว่าไม่มีโมดูลใดจัดหาตัวควบคุม สั่งหรือบริการต่างๆ ที่เกี่ยวข้องกับหน้านี้
  2. สูตรอย่างง่ายใช้ในการบวกเลขสองจำนวน

Output:

นิพจน์ AngularJS

มีการนำ 9 และ 6 มาบวกกัน และแสดงผลลัพธ์คือ 15

AngularJS Numbers

นิพจน์ทำงานกับตัวเลข ตัวอย่างนี้เป็นการคูณตัวแปรตัวเลขสองตัว margin และ profitและแสดงผลผลิตภัณฑ์

AngularJS Numbers

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

    <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

    <h1>Guru99 Global Event</h1>

    <div ng-app="" ng-init="margin=2;profit=200">
        Total profit margin

        {{margin*profit}}
    </div>

</body>
</html>

Code คำอธิบาย:

  1. คำสั่ง ng-init กำหนดตัวแปรและค่าของตัวแปรเหล่านั้นในวิวโดยตรง คล้ายกับตัวแปรโลคอลในเว็บเบราว์เซอร์ทั่วไป ภาษาโปรแกรม. ที่นี่ margin และ profit ได้รับการประกาศและกำหนดแล้ว
  2. จากนั้นนิพจน์ดังกล่าวจะคูณตัวแปรท้องถิ่นทั้งสองตัวนั้นเข้าด้วยกัน

Output:

AngularJS Numbers

มีการคูณ 2 กับ 200 และแสดงผลออกมาเป็น 400

สตริง AngularJS

นิพจน์ยังสามารถใช้กับสตริงได้ด้วย ตัวอย่างนี้กำหนด firstName และ lastName และแสดงผลทั้งสองอย่าง

สตริง AngularJS

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

    <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

    <h1>Guru99 Global Event</h1>

    <div ng-app="" ng-init="firstName='Guru';lastName='99'">
        First Name : {{firstName}}<br>
        Last Name : {{lastName}}
    </div>

</body>
</html>

Code คำอธิบาย:

  1. คำสั่ง ng-init กำหนด firstName ด้วยค่า “Guru"และ lastName โดยมีค่าเป็น “99”
  2. นิพจน์ {{firstName}} และ {{lastName}} อ่านค่าตัวแปรเหล่านั้นและแสดงผลในมุมมอง

Output:

สตริง AngularJS

ค่าทั้งสองจะปรากฏบนหน้าจอ

อ็อบเจ็กต์ AngularJS

นิพจน์ทำงานร่วมกับ Javaต้นฉบับ อ็อบเจ็กต์ ซึ่งประกอบด้วยคู่ชื่อ-ค่า ไวยากรณ์ของ Javaอ็อบเจ็กต์สคริปต์มีลักษณะดังนี้:

var car = {type: "Ford", model: "Explorer", color: "White"};

ตัวอย่างนี้กำหนด person วัตถุที่เก็บคู่คีย์-ค่าสองคู่ firstName และ lastName.

อ็อบเจ็กต์ AngularJS

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

<h1>Guru99 Global Event</h1>

<div ng-app="" ng-init="person={firstName:'Guru',lastName:'99'}">
    First Name : {{person.firstName}}<br>
    Last Name : {{person.lastName}}
</div>

</body>
</html>

Code คำอธิบาย:

  1. คำสั่ง ng-init กำหนดวัตถุ person ด้วยคู่คีย์-ค่า firstName ตั้งค่าเป็น “Guru"และ lastName ตั้งค่าเป็น “99”
  2. นิพจน์ {{person.firstName}} และ {{person.lastName}} อ่านค่าของสมาชิกเหล่านั้น เนื่องจากสมาชิกเหล่านั้นเป็นส่วนหนึ่งของอ็อบเจ็กต์ จึงจำเป็นต้องใช้สัญลักษณ์จุดเพื่อเข้าถึงค่าของพวกมัน

Output:

อ็อบเจ็กต์ AngularJS

ค่าของ firstName และ lastName ปรากฏบนหน้าจอ

อาร์เรย์ AngularJS

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

อาร์เรย์ AngularJS

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

<h1>Guru99 Global Event</h1>

<div ng-app="" ng-init="marks=[1,15,19]">
    Student Marks<br>
    Subject1 : {{marks[0]}}<br>
    Subject2 : {{marks[1]}}<br>
    Subject3 : {{marks[2]}}
</div>

</body>
</html>

Code คำอธิบาย:

  1. คำสั่ง ng-init กำหนดอาร์เรย์ marks โดยมีค่าสามค่าคือ 1, 15 และ 19
  2. การแสดงออกของรูปแบบ marks[index] อ่านแต่ละองค์ประกอบ

Output:

อาร์เรย์ AngularJS

เครื่องหมายที่กำหนดไว้ในอาร์เรย์จะถูกแสดงขึ้น

ความสามารถและข้อจำกัดของ AngularJS Expression

ความสามารถในการ

  1. นิพจน์ AngularJS มีลักษณะคล้ายกัน Javaนิพจน์สคริปต์มีพลังและความยืดหยุ่นคล้ายคลึงกันมาก
  2. ที่ไหน Javaสคริปต์แสดงข้อผิดพลาด ReferenceError หรือ TypeError เมื่อกำหนดค่าคุณสมบัติเป็น undefined แต่การประเมินค่าใน AngularJS นั้นมีความยืดหยุ่นและส่งค่า undefined หรือ null กลับมา
  3. สามารถใช้ตัวกรองภายในนิพจน์เพื่อจัดรูปแบบข้อมูลก่อนแสดงผลได้
  4. ตัวดำเนินการแบบไตรภาคได้รับการสนับสนุน ดังนั้น {{ isReady ? 'Yes' : 'No' }} ถูกต้อง

ข้อ จำกัด

  1. ลูปและการจัดการข้อผิดพลาดไม่สามารถใช้ภายในนิพจน์ของ AngularJS ได้ ตรรกะแบบมีเงื่อนไขจำกัดอยู่เฉพาะตัวดำเนินการแบบเทอร์นารีเท่านั้น if ไม่มีรายงานข้อมูล
  2. ไม่สามารถประกาศฟังก์ชันภายในนิพจน์ได้ แม้แต่ภายในคำสั่ง ng-init ก็ตาม
  3. ไม่สามารถสร้างนิพจน์ปกติภายในนิพจน์อื่นได้ นิพจน์ปกติคือการรวมกันของสัญลักษณ์และอักขระที่ใช้ในการจับคู่สตริง เช่น .*\.txt$และการตีความตามตัวอักษรเช่นนั้นจะถูกปฏิเสธ
  4. ตัวดำเนินการคอมมา (,) และ void ผู้ประกอบการไม่ได้รับอนุญาต

ng-bind กับวงเล็บปีกกาแบบนิพยาม: ควรใช้อันไหน

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

แง่มุม {{ expression }} ง-ไบนด์
เขียนใน เนื้อหาองค์ประกอบ คุณลักษณะขององค์ประกอบ
ก่อนที่ AngularJS จะโหลดเสร็จ ภาพเหล็กดัดฟันดิบปรากฏขึ้นบนหน้าจอ ไม่มีอะไรแสดงให้เห็น
การอ่าน สูงขึ้น — ค่าจะอยู่ในแนวเดียวกัน ค่าที่ต่ำกว่า — ค่าถูกซ่อนอยู่ในแอตทริบิวต์
ค่าหลายค่าต่อองค์ประกอบ มี (ใบกำกับภาษีเต็มรูปแบบ) ไม่ ผูกเพียงอันเดียว
การเข้าเล่มแบบครั้งเดียว ใช่กับ {{::value}} ใช่กับ ng-bind="::value"

การปรากฏของวงเล็บปีกกาแบบดิบๆ เพียงชั่วครู่ เรียกว่า "flash of uninterpolated content" ซึ่งเกิดขึ้นเนื่องจากเบราว์เซอร์แสดงผลมาร์กอัปก่อนที่ AngularJS จะคอมไพล์ ควรใช้ ng-bind หรือเพิ่มคำสั่ง ng-cloak สำหรับเนื้อหาที่มองเห็นได้เหนือส่วนที่มองเห็นได้ทันที (above the fold) ส่วนวงเล็บปีกกาแบบปกติยังคงเป็นตัวเลือกที่ชัดเจนและอ่านง่ายกว่าในส่วนอื่นๆ โดยเฉพาะอย่างยิ่งเมื่อมีค่าหลายค่าอยู่ภายในองค์ประกอบเดียว

ความแตกต่างระหว่างนิพจน์และ $eval

การขอ $eval ฟังก์ชันจะประเมินนิพจน์จากภายในคอนโทรลเลอร์ ในขณะที่นิพจน์จะถูกประเมินในวิว $eval ประเมินผลในโค้ดคอนโทรลเลอร์

ตัวอย่างนี้ใช้ $eval เพื่อบวกตัวเลขสองตัวและนำผลลัพธ์ไปวางไว้บนวัตถุขอบเขตเพื่อให้มุมมองสามารถแสดงผลได้

ความแตกต่างระหว่างนิพจน์และ $eval

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>

<div ng-app="sampleApp" ng-controller="AngularController">
    <h1>Guru99 Global Event</h1>
    {{value}}
</div>

<script>
    var sampleApp = angular.module('sampleApp', []);
    sampleApp.controller('AngularController', function($scope) {
        $scope.a = 1;
        $scope.b = 1;

        $scope.value = $scope.$eval('a+b');
    });
</script>

</body>
</html>

Code คำอธิบาย:

  1. ตัวแปรขอบเขตสองตัว a และ bแต่ละค่าเท่ากับ 1
  2. $scope.$eval ประเมินผลบวกและกำหนดผลลัพธ์ให้กับตัวแปรขอบเขต value.
  3. จากนั้นมุมมองจะแสดงผล value.

Output:

ความแตกต่างระหว่างนิพจน์และ $eval

ผลลัพธ์แสดงค่าของนิพจน์ที่ได้รับการประเมินภายใน ตัวควบคุมโดยผลรวมของตัวแปรขอบเขตทั้งสองจะถูกส่งไปยังและแสดงในมุมมอง

คำถามที่พบบ่อย

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

$eval ประเมินสตริงทันทีเทียบกับ ขอบเขต. $parse ส่งคืนฟังก์ชันที่สามารถนำกลับมาใช้ซ้ำได้สำหรับการประเมินผลซ้ำๆ $interpolate จัดการกับสตริงแม่แบบทั้งหมดที่มีวงเล็บปีกกา แทนที่จะเป็นนิพจน์เดียว

ส่วนใหญ่. AI เครื่องมือจะคงวงเล็บปีกกาไว้และเขียนตัวกรองใหม่เป็นแบบไปป์ แต่ตัวแปร ng-init ไม่มีตัวเทียบเท่าใน Angular และต้องย้ายเข้าไปในคลาสคอมโพเนนต์ด้วยตนเอง

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

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

สรุปโพสต์นี้ด้วย: