ฉันจะส่งวัตถุ $ scope จากคอนโทรลเลอร์หนึ่งไปยังคอนโทรลเลอร์อื่นได้อย่างไรโดยใช้ $ emit และ. $ ในเมธอด?
คุณสามารถส่งวัตถุใด ๆ ที่คุณต้องการภายในลำดับชั้นของ app ของคุณรวมถึง$ ขอบเขต
นี่คือความคิดที่รวดเร็วเกี่ยวกับวิธีการออกอากาศและปล่อยการทำงาน
สังเกตเห็นโหนดด้านล่าง; ทั้งหมดซ้อนกันภายในโหนด 3 คุณใช้การกระจายและปล่อยเมื่อคุณมีสถานการณ์นี้
หมายเหตุ:จำนวนของแต่ละโหนดในตัวอย่างนี้เป็นค่าที่กำหนดเอง มันอาจเป็นหมายเลขหนึ่งได้อย่างง่ายดาย หมายเลขสอง หรือแม้แต่จำนวน 1,348 แต่ละหมายเลขเป็นเพียงตัวระบุสำหรับตัวอย่างนี้ จุดของตัวอย่างนี้คือการแสดงการซ้อนของ Angular controllers / directives
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
ตรวจสอบต้นไม้ต้นนี้ คุณตอบคำถามต่อไปนี้อย่างไร
หมายเหตุ:มีวิธีอื่น ๆ ที่จะตอบคำถามเหล่านี้ที่นี่เราจะพูดถึง แต่การออกอากาศและปล่อย นอกจากนี้เมื่ออ่านข้อความด้านล่างถือว่าแต่ละหมายเลขมีไฟล์เป็นของตัวเอง (คำสั่งตัวควบคุม) ตัวอย่างเช่น one.js, two.js, three.js
โหนด1พูดกับโหนด3 ได้อย่างไร
ในไฟล์one.js
scope.$emit('messageOne', someValue(s));
ในไฟล์three.js - โหนดบนสุดไปยังโหนดชายด์ทั้งหมดที่ต้องการสื่อสาร
scope.$on('messageOne', someValue(s));
โหนด 2 พูดกับโหนด 3 อย่างไร
ในไฟล์two.js
scope.$emit('messageTwo', someValue(s));
ในไฟล์three.js - โหนดบนสุดไปยังโหนดชายด์ทั้งหมดที่ต้องการสื่อสาร
scope.$on('messageTwo', someValue(s));
โหนด 3 พูดกับโหนด 1 และ / หรือโหนด 2 ได้อย่างไร
ในไฟล์three.js - โหนดบนสุดไปยังโหนดชายด์ทั้งหมดที่ต้องการสื่อสาร
scope.$broadcast('messageThree', someValue(s));
ในไฟล์one.js && two.jsไฟล์ใดที่คุณต้องการจับข้อความหรือทั้งสองอย่าง
scope.$on('messageThree', someValue(s));
โหนด 2 พูดกับโหนด 1 อย่างไร
ในไฟล์two.js
scope.$emit('messageTwo', someValue(s));
ในไฟล์three.js - โหนดบนสุดไปยังโหนดชายด์ทั้งหมดที่ต้องการสื่อสาร
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
ในไฟล์one.js
scope.$on('messageTwo', someValue(s));
อย่างไรก็ตาม
เมื่อคุณมีทั้งหมดเหล่านี้โหนดลูกซ้อนกันพยายามที่จะสื่อสารเช่นนี้คุณได้อย่างรวดเร็วจะเห็นหลาย$ บน , $ ออกอากาศและ$ ปล่อยของ
นี่คือสิ่งที่ฉันต้องการจะทำ
ในโหนด PARENT NODE ( 3ในกรณีนี้ ... ) ซึ่งอาจเป็นตัวควบคุมหลักของคุณ ...
ดังนั้นในไฟล์three.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
ตอนนี้ในใด ๆ ของโหนดลูกที่คุณจะต้อง$ ปล่อยข้อความหรือจับมันใช้$ บน
หมายเหตุ:โดยปกติแล้วจะค่อนข้างง่ายต่อการข้ามการพูดคุยในหนึ่งพา ธ ที่ซ้อนกันโดยไม่ใช้$ emit , $ broadcastหรือ$ onซึ่งหมายความว่ากรณีการใช้งานส่วนใหญ่จะใช้เมื่อคุณพยายามรับโหนด1เพื่อสื่อสารกับโหนด2หรือในทางกลับกัน
โหนด 2 พูดกับโหนด 1 อย่างไร
ในไฟล์two.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
ในไฟล์three.js - โหนดบนสุดไปยังโหนดชายด์ทั้งหมดที่ต้องการสื่อสาร
เราจัดการกับสิ่งนี้แล้วจำได้ไหม?
ในไฟล์one.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
คุณจะยังต้องใช้$ onกับค่าเฉพาะที่คุณต้องการจับ แต่ตอนนี้คุณสามารถสร้างสิ่งที่คุณต้องการในโหนดใด ๆ โดยไม่ต้องกังวลเกี่ยวกับวิธีการรับข้อความข้ามช่องว่างโหนดหลักในขณะที่เราจับและออกอากาศ ทั่วไปpushChangesToAllNodes
หวังว่านี่จะช่วย ...
$rootScope
เพื่อออกอากาศ / ปล่อยเมื่อสามารถหลีกเลี่ยงได้