วิธีการตั้งค่าแอตทริบิวต์ id ขององค์ประกอบ HTML แบบไดนามิกด้วย angularjs (1.x)?


คำตอบ:


392

ngAttr คำสั่งทั้งหมดสามารถช่วยได้ที่นี่ตามที่แนะนำในเอกสารอย่างเป็นทางการ

https://docs.angularjs.org/guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes

ตัวอย่างเช่นในการตั้งค่าidคุณลักษณะของdivองค์ประกอบเพื่อให้มีดัชนีชิ้นส่วนมุมมองอาจมี

<div ng-attr-id="{{ 'object-' + myScopeObject.index }}"></div>

ซึ่งจะได้รับการแก้ไขเพื่อ

<div id="object-1"></div>

1
ในกรณีที่ไม่myScopeObjectมาจากไหน? ฉันจะกำหนดมันที่ไหน
Jan Aagaard

1
@JanAagaard ให้เราสมมติว่าmyScopeObjectเป็นคุณสมบัติของscopeวัตถุที่เปิดเผยโดยใช้ตัวควบคุม กรุณาเห็นdocs.angularjs.org/guide/controller ชัดเจนพอสำหรับคุณหรือฉันจะอธิบายเพิ่มเติมหรือไม่
Thierry Marianne

ฉันทำ ng-attr-id = "{{'Panel' + file.Id}}" แต่มันไม่ได้สร้าง id = "Panel12312" สำหรับฉัน :(
Manuel Maestrini

17
พฤติกรรมทั้งสองต่อไปนี้ไม่เหมือนกัน: <div id="{{ 'object' + index }}">และ<div ng-attr-id="{{ 'object' + index }}">? เอกสารดูเหมือนจะพูด prepending คือการช่วยให้ออกสำหรับกรณีที่มีองค์ประกอบเป็นสิ่งที่ไม่ได้มาตรฐานเช่นไม่ได้เป็นng-attr- <div>ฉันอ่านเอกสารใช่มั้ย
broc.seib

3
@ broc.seib โดยใช้ nd-attr ไม่เพียง แต่เกี่ยวกับมาตรฐาน นี่เป็นแนวปฏิบัติที่ดีเนื่องจากล่าม HTML สามารถกำหนดรหัสให้กับองค์ประกอบก่อนที่จะโหลดเชิงมุม และ ng-attr ช่วยให้มั่นใจได้ว่าจะต้องกำหนด id ให้กับองค์ประกอบเมื่อโหลดเชิงมุมเท่านั้น เป็นกรณีเดียวกันสำหรับ ng-src ในแท็ก <img>
อเล็กซ์

70

สิ่งนี้ทำงานได้ดีสำหรับฉัน:

<div id="{{ 'object-' + $index }}"></div>


เวลาผ่านไปและบางทีไวยากรณ์ที่ใช้งานง่ายที่สุดในตอนนี้ก็ทำงานได้ตามที่คาดไว้ ฉันจำได้ว่ามีปัญหาในขณะที่วนซ้ำรายการ
ธีรี่ร์แมเรียนน์

2
วิธีนี้จะทำงานได้ถูกต้องใน 90% ของกรณี แต่บางครั้งคุณอาจได้รับข้อผิดพลาดซึ่งยากต่อการแก้ไข คุณควรใช้ ng-attr-id แทน
Baki

ng-attr-idมีประโยชน์ในสถานการณ์ 0% ไม่สามารถให้ตัวอย่างได้เนื่องจากไม่มี
ข้าม

5
ng-attr-idวิธีการเพื่อให้แน่ใจว่าการแสดงออกงะดิบจะไม่แสดงผลในแอตทริบิวต์ที่ถูกต้อง HTML (เช่นid, labelฯลฯ ) นี้คือการหยุดการใช้งานใด ๆ ปลายน้ำอ่าน ng 'ขยะ' (เช่นก่อนที่จะทำให้เสร็จสมบูรณ์แล้วหรือหลังจากที่ผิดพลาด js)
overflew

34

ในกรณีที่คุณมาถึงคำถามนี้ แต่ที่เกี่ยวข้องกับการใหม่รุ่นเชิงมุม> = 2.0

<div [id]="element.id"></div>

2
นั่นไม่เป็นประโยชน์คำถามอยู่ในบริบทของ AngularJS
btk

8
ฉันเห็นด้วย; มันจะเป็นประโยชน์กับสมาชิกเหล่านั้นเท่านั้นที่พบว่ามีประโยชน์
SoEzPz

16
สมาชิกบางคนยังคงคลิกที่ลิงค์ Angularjs แม้ว่าพวกเขากำลังค้นหาลิงก์ของ Angular มันค่อนข้างสับสนและความผิดพลาดก็จะเกิดขึ้นต่อไป
SoEzPz

24

วิธีที่สวยงามกว่าที่ฉันพบเพื่อให้บรรลุพฤติกรรมนี้คือ:

<div id="{{ 'object-' + myScopeObject.index }}"></div>

สำหรับการนำไปใช้ของฉันฉันต้องการให้แต่ละองค์ประกอบอินพุตใน ng-repeat กับแต่ละรายการมีรหัสเฉพาะเพื่อเชื่อมโยงป้ายกำกับ ดังนั้นสำหรับอาร์เรย์ของวัตถุที่อยู่ใน myScopeObjects เราสามารถทำได้:

<div ng-repeat="object in myScopeObject">
    <input id="{{object.name + 'Checkbox'}}" type="checkbox">
    <label for="{{object.name + 'Checkbox'}}">{{object.name}}</label>
</div>

ความสามารถในการสร้างรหัสที่ไม่ซ้ำกันในทันทีนั้นมีประโยชน์มากเมื่อเพิ่มเนื้อหาเช่นนี้แบบไดนามิก


ฉันคิดว่าวิธีการนี้มีปัญหา ฉันกำลังเริ่มต้นการโยงเชิงมุมหลังจากโหลดหน้าเว็บแล้ว ในบางครั้ง div ล้มเหลวในการโหลดอย่างถูกต้องซึ่งฉันเดาว่าเป็นเพราะการปะทะกันของ id ของ div ที่แตกต่างกัน
sumeet

น่าสนใจ หากคุณสามารถทำซ้ำพฤติกรรมของคุณในตัวอย่างเสียงพลั่วได้ฉันยินดีที่จะตรวจสอบ การใช้ 'ng-attr-id =' ใช้งานได้และใช้ 'id =' ไม่ได้หรือไม่
Cumulo Nimbus

9

คุณสามารถทำสิ่งต่อไปนี้ได้

ใน js ของคุณ

$scope.id = 0;

ในเทมเพลตของคุณ

<div id="number-{{$scope.id}}"></div>

ซึ่งจะทำให้

<div id="number-0"></div>

ไม่จำเป็นต้องต่อกันภายในวงเล็บปีกกาคู่



0

หากคุณใช้ไวยากรณ์นี้:

<div ng-attr-id="{{ 'object-' + myScopeObject.index }}"></div>

เชิงมุมจะทำให้บางสิ่งเช่น:

 <div ng-id="object-1"></div>

อย่างไรก็ตามไวยากรณ์นี้:

<div id="{{ 'object-' + $index }}"></div>

จะสร้างสิ่งที่ชอบ:

<div id="object-1"></div>

6
อธิบายสิ่งที่คุณพยายามจะพูด
Kumar

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