คำถามนี้ได้ถูกเอาชนะไปแล้ว แต่ฉันจะแบ่งปันเรื่องนี้ต่อไปในกรณีที่มีคนอื่นกำลังดิ้นรนกับความยุ่งเหยิงที่น่ากลัวซึ่งเป็นขอบเขตของ AngularJS นี้จะครอบคลุม=, <, @, และ& ::เขียนเต็มสามารถพบได้ที่นี่
=สร้างการผูกสองทาง การเปลี่ยนคุณสมบัติในพาเรนต์จะส่งผลให้เกิดการเปลี่ยนแปลงในเด็กและในทางกลับกัน
<สร้างการเชื่อมโยงทางเดียวกับผู้ปกครองไปยังลูก การเปลี่ยนคุณสมบัติในพาเรนต์จะส่งผลให้เกิดการเปลี่ยนแปลงในลูก แต่การเปลี่ยนคุณสมบัติลูกจะไม่ส่งผลต่อคุณสมบัติพาเรนต์
@จะกำหนดคุณสมบัติสตริงให้กับคุณสมบัติของแท็ก หากแอ็ตทริบิวต์มีนิพจน์คุณสมบัติของชายด์จะอัพเดตทุกครั้งที่นิพจน์ประเมินเป็นสตริงอื่น ตัวอย่างเช่น:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
ที่นี่descriptionคุณสมบัติในขอบเขตลูกจะเป็นค่าปัจจุบันของการแสดงออก"The movie title is {{$ctrl.movie.title}}"ซึ่งmovieเป็นวัตถุในขอบเขตหลัก
&ค่อนข้างยุ่งยากและในความเป็นจริงดูเหมือนจะไม่มีเหตุผลที่น่าสนใจที่จะใช้มัน อนุญาตให้คุณประเมินค่านิพจน์ในขอบเขตพาเรนต์แทนที่พารามิเตอร์ด้วยตัวแปรจากขอบเขตลูก ตัวอย่าง ( เสียงดังปัง ):
<child-component
foo = "myVar + $ctrl.parentVar + myOtherVar"
</child-component>
angular.module('heroApp').component('childComponent', {
template: "<div>{{ $ctrl.parentFoo({myVar:5, myOtherVar:'xyz'}) }}</div>",
bindings: {
parentFoo: '&foo'
}
});
ป.ร. ให้ไว้parentVar=10, การแสดงออกparentFoo({myVar:5, myOtherVar:'xyz'})จะประเมิน5 + 10 + 'xyz'และส่วนประกอบจะทำให้เป็น:
<div>15xyz</div>
คุณต้องการใช้ฟังก์ชันการทำงานที่ซับซ้อนนี้เมื่อใด &บ่อยครั้งที่บุคคลใช้เพื่อส่งผ่านขอบเขตย่อยฟังก์ชันการเรียกกลับในขอบเขตหลัก ในความเป็นจริงอย่างไรก็ตามเอฟเฟ็กต์แบบเดียวกันสามารถทำได้โดยใช้ '<' เพื่อส่งผ่านฟังก์ชั่นซึ่งตรงไปตรงมามากขึ้นและหลีกเลี่ยงการใช้ซิงก์วงเล็บปีกกาที่น่าอึดอัดใจในการส่งพารามิเตอร์ ( {myVar:5, myOtherVar:'xyz'}) พิจารณา:
โทรกลับโดยใช้&:
<child-component parent-foo="$ctrl.foo(bar)"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo({bar:'xyz'})">Call foo in parent</button>',
bindings: {
parentFoo: '&'
}
});
โทรกลับโดยใช้<:
<child-component parent-foo="$ctrl.foo"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo('xyz')">Call foo in parent</button>',
bindings: {
parentFoo: '<'
}
});
โปรดทราบว่าวัตถุ (และอาร์เรย์) ถูกส่งผ่านโดยอ้างอิงไปยังขอบเขตลูกไม่ได้คัดลอก สิ่งนี้หมายความว่าแม้ว่าจะเป็นการรวมทางเดียวคุณกำลังทำงานกับวัตถุเดียวกันทั้งในขอบเขตหลักและลูก
หากต้องการดูคำนำหน้าที่แตกต่างกันให้เปิดปังตัวนี้นี้
ใช้การรวมครั้งเดียว (การกำหนดค่าเริ่มต้น)
::
[เอกสารอย่างเป็นทางการ]
รุ่นที่ใหม่กว่าของ AngularJS แนะนำตัวเลือกให้มีผลผูกพันเพียงครั้งเดียวซึ่งคุณสมบัติขอบเขตลูกได้รับการอัพเดตเพียงครั้งเดียว สิ่งนี้ช่วยปรับปรุงประสิทธิภาพโดยไม่จำเป็นต้องดูคุณสมบัติหลัก ไวยากรณ์แตกต่างจากด้านบน ในการประกาศการเชื่อมโยงครั้งเดียวคุณเพิ่ม::ด้านหน้าของนิพจน์ในแท็กคอมโพเนนต์ :
<child-component
tagline = "::$ctrl.tagline">
</child-component>
สิ่งนี้จะเผยแพร่ค่าของtaglineขอบเขตลูกโดยไม่สร้างการโยงทางเดียวหรือสองทาง หมายเหตุ : ถ้าtaglineเริ่มแรกundefinedในขอบเขตพาเรนต์เชิงมุมจะตรวจสอบมันจนกว่าจะเปลี่ยนจากนั้นทำการอัพเดตคุณสมบัติที่เกี่ยวข้องในขอบเขตลูกเพียงครั้งเดียว
สรุป
ตารางด้านล่างแสดงให้เห็นว่าคำนำหน้าทำงานอย่างไรขึ้นอยู่กับว่าคุณสมบัตินั้นเป็นวัตถุอาร์เรย์สตริง ฯลฯ
