AngularJS และการใช้ตัวแปรดอลลาร์


128

ไม่มีใครทราบว่าเหตุผลเบื้องหลังการใช้วิธีดอลลาร์และตัวแปรใน angularJS คือการสั่ง angularJS เพื่อหลีกเลี่ยงการตรวจสอบค่าเหล่านั้นเมื่อการย่อยเกิดขึ้น? ดังนั้นถ้ามุมตรงข้าม$scope.$valueและ$scope.valueมันจะหลีกเลี่ยงการตรวจสอบก่อนเพราะมันมีคำนำหน้าด้วยอักขระดอลลาร์ในชื่อตัวแปรหรือไม่


ดูโพสต์บล็อกนี้เพิ่มเติมเกี่ยวกับความแตกต่างของ "$ scope" และ "scope" ใน angularjs ...
MarcoS

19
มุมอาจจะพยายามที่จะ $ ออกจาก jQuery
daniel1426

ลิงก์นั้นเปลี่ยนเส้นทางไปยังหน้าเว็บที่ไม่ได้อธิบายเกี่ยวกับ $ scope
Paul Brannan

5
เอกสารสำหรับการสั่ง - ควบคุมมีแต่คำสั่งมี$scope scopeWTF?
LeeGee

คำตอบ:


87

มีบางครั้งที่ Angular ละเว้นตัวแปรที่ขึ้นต้นด้วยเครื่องหมายดอลลาร์:

  1. ในความคิดเห็นของ Schumliด้านล่างซึ่งตัวกรอง json จะไม่ส่งออกพวกเขา
  2. เมื่อใช้{{ }}คำสั่งเชิงมุมจะไม่แสดง ตัวแปรที่ซ้อนกัน $เช่นนี้แสดงvisibleคุณสมบัติเท่านั้น

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. นอกจากนี้เมื่อเพิ่มผู้สังเกตการณ์ที่ชัดเจนในวัตถุขอบเขตการเปลี่ยนแปลงคุณสมบัติด้วยเครื่องหมายดอลลาร์ชั้นนำของวัตถุนี้จะไม่ทริกเกอร์ผู้เฝ้าดู ดูซออัพเดทนี้

  4. angular.equals() ละเว้นคีย์ที่$ขึ้นต้นด้วย


ใช่ดูเหมือนว่าคุณพูดถูก แม้จะมีเหตุการณ์คลิกและอื่น ๆ ก็ยังคงมีการเปลี่ยนแปลง ขอบคุณ.
matsko

7
มีบางส่วนของ Angular ที่ไม่สนใจคุณสมบัตินำหน้าตัวอย่างเช่นตัวกรอง 'json' จะไม่ส่งออกตัวแปรที่ขึ้นต้นด้วย '$'
Schmuli

116

มันเป็นเพียงการตั้งชื่อจากตัวอย่างข้อมูลด้านล่าง http://docs.angularjs.org/tutorial/step_05

'$' Prefix Naming Convention
คุณสามารถสร้างบริการของคุณเองและในความเป็นจริงเราจะทำอย่างนั้นในขั้นตอนที่ 11 ในฐานะแบบแผนการตั้งชื่อบริการในตัวของแองกูลาร์วิธีการในขอบเขตและ API เชิงมุมอื่น ๆ ข้างหน้าชื่อ อย่าใช้คำนำหน้า '$' เมื่อตั้งชื่อบริการและรุ่นของคุณเพื่อหลีกเลี่ยงการชนกันของชื่อ

http://docs.angularjs.org/guide/concepts#angular_namespace

Angular Namespace
เพื่อป้องกันการชนกันของชื่อโดยไม่ได้ตั้งใจ, Angular นำหน้าชื่อของวัตถุที่อาจชนกับ $ โปรดอย่าใช้คำนำหน้า $ ในรหัสของคุณเนื่องจากอาจเกิดการชนกับรหัส Angular โดยไม่ได้ตั้งใจ


2
ทำไมเอกสารคำสั่ง [1] มี$scopeตัวควบคุม แต่เป็นscopeคำสั่ง? --- [1] docs.angularjs.org/guide/directive
LeeGee

2
@ LeeGee มันเป็นแค่การประชุม stackoverflow.com/a/19289054/114558
rinogo

30

$คำนำหน้าหมายถึงตัวแปรพารามิเตอร์ทรัพย์สินหรือวิธีการที่เป็นแกนหลักของเชิงมุม

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

ไม่มีผลกระทบใด ๆ กับวิธีที่โค้ดถูกตีความโดยรันไทม์แม้ว่าเฟรมเวิร์กนั้นอาจให้ความหมายพิเศษ โดยทั่วไปมันเป็นแบบแผนการตั้งชื่อที่บอกว่า "คุณไม่ควรยุ่งกับเรื่องนี้"


ฉันคิดว่าคุณเข้าใจผิด รันไทม์ไม่สนใจสิ่งที่ตัวแปรที่มีชื่อ คุณสามารถเรียกมันได้$$__$_$- เป็นเพียงตัวระบุที่ไม่มีความหมายพิเศษสำหรับล่าม
58

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

7

ไม่แน่ใจอย่างสมบูรณ์ แต่ฉันเชื่อว่า AngularJS internals พึ่งพาการจัดการกับตัวแปร $ -prefixed เหล่านี้ในระหว่างการแยกย่อย การตรวจสอบตัวแปรเหล่านี้จะหมายถึงการแยกย่อยจะไม่ทำให้เสถียรเนื่องจากอาจเปลี่ยนแปลงตลอดเวลาในแต่ละรอบการย่อย

อย่าพูดถึงฉัน :)


10
ลงเนื่องจาก: "อย่าอ้างฉันบนมัน" ขออภัย แต่คำตอบที่ยอมรับความไม่แน่นอนนั้นไม่เป็นประโยชน์อย่างยิ่ง :(
David Rivers

2
Downvote แปลงเป็น up- สมมติว่าคุณพูดถูกนี่เป็นคำตอบที่มีประโยชน์แล้ว!
David Rivers

2
@DavidRivers หากคำตอบในตอนแรกลังเลว่าการประกาศใหม่จะไม่ทำให้มีประโยชน์มากขึ้น ในความเป็นจริงคำตอบอาจจะไม่ถูกต้องและขาดความลังเลจะยืนยัน wrongness แต่เพื่อให้คำตอบนี้มีประโยชน์ควรสำรองข้อมูลพร้อมหลักฐานบางอย่างโดยอ้างถึงแหล่งที่เชื่อถือได้หรือจัดหาซอที่จะทำซ้ำจุดที่แสดงออกมา
Ivaylo Slavov

1
@IvayloSlavov: ฉันเห็นด้วยอย่างยิ่งกับคุณ ฉันสันนิษฐาน (อาจผิด) ว่าผู้ตอบตอบตรวจสอบอีกครั้งว่าเขาพูดถูกและไม่ได้แค่พูดคำตอบเพื่อลบความไม่แน่นอนออกไป ฉันคิดว่าฉันควรจะต้องการแหล่งที่มาหรือซอ
David Rivers

1
@ Alexford: เฮ้ชาย ขอบคุณสำหรับคำขอโทษ! ฉันขอโทษฉันยังไม่ชัดเจนและเริ่มการสื่อสารที่ผิดพลาดทั้งหมดนี้อยู่ดี ประเด็นของคุณถูกต้องและฉันเห็นด้วยกับคุณ ฉันแค่อยากจะทำให้แน่ใจว่าฉันไม่ได้ถูกบิดเบือน แต่ฉันก็ไม่ชัดเจนกับถ้อยคำของตัวเอง อย่างไรก็ตามไม่มีความรู้สึกที่ยากลำบากและฉันเคารพอย่างแท้จริงว่าคุณสามารถเห็นมุมมองของฉัน ไชโยชาย!
David Rivers

5

ฉันคิดเสมอว่า$ดูเหมือนว่า "S" เพื่อรับบริการ


นั่นคือคำตอบที่ถูกต้อง มันเป็นตรรกะและเรียบง่าย บริการเหล่านี้เป็นบริการจริงดังนั้นจึงควรจำไว้ว่า $ 'S' เป็นบริการ คำอธิบายที่ดีง่าย
Yonk

2
$ scope เป็นบริการหรือไม่
สิ้นสุด

5

สัญญาณ Dollar ( $ ) ยังป้องกันไม่ให้องค์ประกอบถูกทำซ้ำ (หรือตีความ) ในคำสั่งบางอย่าง ดังนั้นตัวอย่างคุณสมบัติที่ขึ้นต้นด้วย$จะไม่ถูกใช้ng-repeatเนื่องจากข้อถ้าในห่วงสำหรับ for :

if(collection.hasOwnProperty(key) && key.charAt(0) != '$')

มีคนสร้างปัญหาเกี่ยวกับหัวข้อที่นี่ในหน้าเพจ github


ในshallowCopyคุณสมบัติของเมธอดที่ขึ้นต้นด้วย$$จะถูกข้ามเนื่องจากประโยค if ในขณะวนซ้ำคุณสมบัติ :

if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {

1

@MarcoS ให้ลิงก์ไปที่https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scopeซึ่งจะอธิบายความแตกต่างระหว่าง $ scope และขอบเขต ฉันพบว่ามีประโยชน์นี้เพิ่มข้อมูลในคำตอบอื่น ๆ

ในคำสั่งเชิงมุมมีลิงค์และตัวควบคุม การเชื่อมโยงเป็นฟังก์ชั่นมาตรฐานพร้อมชุดพารามิเตอร์คงที่: ขอบเขตองค์ประกอบวัตถุแอตทริบิวต์

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

ผู้เขียนhttps://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scopeทำงานได้ดีกว่าในการอธิบาย


-1

มีความแตกต่างอย่างมากไม่ใช่ในตัวแปร แต่ในพารามิเตอร์ที่คอนโทรลเลอร์ได้รับ พารามิเตอร์ขอบเขตแตกต่างจาก $ scope อย่างสิ้นเชิง

สำหรับข้อมูลเพิ่มเติมตรวจสอบโพสต์ที่มีประโยชน์นี้: http://www.thinkster.io/angularjs/aw9kWmdnik/angularjs-scope-vs-scope

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.