คำถามนี้ได้ถูกเอาชนะไปแล้ว แต่ฉันจะแบ่งปันเรื่องนี้ต่อไปในกรณีที่มีคนอื่นกำลังดิ้นรนกับความยุ่งเหยิงที่น่ากลัวซึ่งเป็นขอบเขตของ 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
ในขอบเขตพาเรนต์เชิงมุมจะตรวจสอบมันจนกว่าจะเปลี่ยนจากนั้นทำการอัพเดตคุณสมบัติที่เกี่ยวข้องในขอบเขตลูกเพียงครั้งเดียว
สรุป
ตารางด้านล่างแสดงให้เห็นว่าคำนำหน้าทำงานอย่างไรขึ้นอยู่กับว่าคุณสมบัตินั้นเป็นวัตถุอาร์เรย์สตริง ฯลฯ