จะเพิ่มคุณสมบัติตามเงื่อนไขใน Angular 2 ได้อย่างไร


276

ฉันจะเพิ่มคุณสมบัติองค์ประกอบเช่นcheckedกล่องกาเครื่องหมายตามเงื่อนไขได้อย่างไร

รุ่นก่อนหน้าของ Angular มีNgAttrและฉันคิดว่าNgCheckedสิ่งที่ดูเหมือนจะให้ฟังก์ชั่นที่ฉันหลังจาก อย่างไรก็ตามคุณสมบัติเหล่านี้ดูเหมือนจะไม่มีอยู่ใน Angular 2 และฉันไม่เห็นวิธีอื่นในการให้บริการฟังก์ชั่นนี้


1
ดูเพิ่มเติมที่: stackoverflow.com/questions/36240736/…
Matty


2
ชาว Google ในกรณีที่คุณต้องการแอตทริบิวต์ที่มีมูลค่าน้อยที่จะเป็นองค์ประกอบเชิงมุมดูที่นี่
แฟรงก์ Nocke

คำตอบ:


574

null ลบมัน:

[attr.checked]="value ? '' : null"

หรือ

[attr.checked]="value ? 'checked' : null"

คำแนะนำ:

คุณสมบัติเทียบกับคุณสมบัติ

เมื่อองค์ประกอบ HTML ที่คุณเพิ่มการรวมนี้ไม่มีคุณสมบัติที่มีชื่อที่ใช้ในการผูก ( checkedในกรณีนี้) และยังไม่มีการใช้องค์ประกอบเชิงมุมหรือคำสั่งกับองค์ประกอบเดียวกันที่มี@Input() checked;แล้ว[xxx]="..."ไม่สามารถใช้

ดูเพิ่มเติมความแตกต่างระหว่างคุณสมบัติและคุณลักษณะใน HTML คืออะไร

สิ่งที่ต้องผูกมัดเมื่อไม่มีทรัพย์สินดังกล่าว

ทางเลือกที่จะ[style.xxx]="...", [attr.xxx]="...", [class.xxx]="..."ขึ้นอยู่กับสิ่งที่คุณพยายามที่จะประสบความสำเร็จ

เพราะ<input>มีcheckedแอตทริบิวต์เท่านั้น แต่ไม่มีcheckedคุณสมบัติใด[attr.checked]="..."ที่เหมาะสมสำหรับกรณีนี้

คุณสมบัติสามารถจัดการค่าสตริงได้เท่านั้น

ข้อผิดพลาดทั่วไปก็คือการ[attr.xxx]="..."ผูกค่า ( ...) นั้นจะถูกทำให้เป็นสตริงเสมอ คุณสมบัติและ@Input()s เท่านั้นที่สามารถรับค่าชนิดอื่นเช่นบูลีน, ตัวเลข, วัตถุ, ...

คุณสมบัติและคุณลักษณะส่วนใหญ่ขององค์ประกอบเชื่อมต่อกันและมีชื่อเหมือนกัน

การเชื่อมต่อคุณสมบัติคุณสมบัติ

เมื่อผูกเข้ากับคุณสมบัติคุณสมบัติยังได้รับค่าที่ทำให้เป็นสตริงจากแอตทริบิวต์เท่านั้น
เมื่อถูกผูกเข้ากับคุณสมบัติคุณสมบัติจะได้รับค่าที่ถูกผูกไว้กับมัน (บูลีน, ตัวเลข, วัตถุ, ... ) และคุณสมบัติอีกครั้งเป็นค่าสตริง

สองกรณีที่แอตทริบิวต์และชื่อคุณสมบัติไม่ตรงกัน

Angular ถูกเปลี่ยนตั้งแต่นั้นและรู้เกี่ยวกับกรณีพิเศษเหล่านี้และจัดการกับมันเพื่อให้คุณสามารถผูก<label [for]="แม้ว่าจะไม่มีคุณสมบัติดังกล่าว (เหมือนกันcolspan)


3
คุณสามารถละเว้น "attr." อุปสรรค
Filip Stachowiak

16
@FilipStachowiak ดังนั้นมันจะไม่กลายเป็นแอตทริบิวต์ มีคุณสมบัติที่หลากหลายในองค์ประกอบหลายอย่างที่องค์ประกอบสะท้อนให้เห็นถึงค่าที่ถูกผูกไว้กับทรัพย์สินเพื่อแอตทริบิวต์ (และทิศทางอื่น ๆ ) attr.ในกรณีนี้คุณไม่จำเป็นต้อง แต่ถ้าคุณต้องการเพิ่มแอตทริบิวต์ที่กำหนดเองคุณต้องมีattr.คำนำหน้าแน่นอน
GünterZöchbauer

14
เพื่อความชัดเจนคุณต้องมีattr.ส่วนนี้ ฉันพยายามตั้งค่า[href]และต้องการให้มันตั้งค่าหากhrefคุณสมบัติของรายการมีอยู่เท่านั้น หากไม่มี[attr.href]สิ่งนี้จะเพิ่ม href ด้วยค่า 'null' ซึ่งเมื่อคลิกแล้วจะรีเฟรชหน้าปัจจุบัน [attr.href]ซ่อมมัน.
dudewad

@dewewad ที่ฟังดูไม่เหมาะกับฉัน ถ้าคุณตั้งค่าhrefในองค์ประกอบที่มีด้วยคุณสมบัติที่มีความจำเป็นที่จะใช้ไม่ได้href attrต้องมีบางอย่างผิดพลาดอย่างอื่น
GünterZöchbauer

@ Günter-zöchbauerดีฉันใช้ Ng 4.x และ<a [href]="item.href">ที่item.hrefจะไม่ได้กำหนด (ไม่ได้ค่าไม่ได้กำหนด แต่ทรัพย์สินที่hrefไม่ได้อยู่บนitem) คือการตั้งค่าแอตทริบิวต์href nullฉันไม่ได้เจาะลึกลงไปในแหล่งข้อมูลเพราะจริงๆแล้วฉันไม่ค่อยสนใจในจุดนี้ (นี่เป็นรายละเอียดเล็ก ๆ ) แต่attr.เป็นคำสั่งที่แตกต่างออกไปโดยสิ้นเชิงและดังนั้นการแสดงที่แตกต่างกัน
dudewad

37

ในไวยากรณ์แอตทริบิวต์ angular-2 คือ

<div [attr.role]="myAriaRole">

เชื่อมโยงบทบาทแอ็ตทริบิวต์กับผลลัพธ์ของนิพจน์ myAriaRole

ดังนั้นสามารถใช้เช่น

[attr.role]="myAriaRole ? true: null"

9
นี่คือปัญหาที่ว่าเมื่อyour expressionเป็นfalseแอตทริบิวต์ใน DOM <div checked="false">จะมีลักษณะเหมือน ฉันไม่คิดว่านี่เป็นผลที่ตั้งใจ
GünterZöchbauer

7
ขอบคุณ แต่ฉันถามว่าจะเพิ่มคุณสมบัติแบบมีเงื่อนไขอย่างไรไม่ได้กำหนดค่าตามเงื่อนไข
Jonathan Miles

คุณสามารถเว้น "attr" ได้ อุปสรรค
Filip Stachowiak

1
@FilipStachowiak ดังนั้นมันจะไม่กลายเป็นแอตทริบิวต์ มีคุณสมบัติที่หลากหลายในองค์ประกอบหลายอย่างที่องค์ประกอบสะท้อนให้เห็นถึงค่าที่ถูกผูกไว้กับทรัพย์สินเพื่อแอตทริบิวต์ (และทิศทางอื่น ๆ ) attr.ในกรณีนี้คุณไม่จำเป็นต้อง แต่ถ้าคุณต้องการที่จะเพิ่มแอตทริบิวต์ที่กำหนดเองคุณต้องมีattr.คำนำหน้าแน่นอน
GünterZöchbauer

โอ้ชายคนนี้: เป็นโมฆะที่น่าอัศจรรย์สิ่งที่รู้ว่าสามารถใช้ในเงื่อนไข! ขอบคุณสำหรับการแก้ปัญหา
pinarella

17

การปรับGünterZöchbauerตอบ:

สิ่งนี้ดูเหมือนจะแตกต่างกันในขณะนี้ ฉันพยายามทำเช่นนี้เพื่อใช้คุณลักษณะ href กับแท็กจุดยึดตามเงื่อนไข คุณต้องใช้ไม่ได้กำหนดสำหรับกรณี 'ไม่ได้ใช้' ตัวอย่างเช่นฉันจะแสดงให้เห็นถึงการเชื่อมโยงที่มีเงื่อนไขมีการใช้แอตทริบิวต์ href

แท็กสมอโดยไม่ต้องแอตทริบิวต์ href กลายเป็นข้อความล้วนแสดงให้เห็นตัวยึดสำหรับการเชื่อมโยงการต่อข้อมูลจำเพาะเชื่อมโยงหลายมิติ

สำหรับการนำทางของฉันฉันมีรายการลิงก์ แต่หนึ่งในลิงก์เหล่านั้นแสดงถึงหน้าปัจจุบัน ฉันไม่ต้องการให้ลิงค์ของเพจปัจจุบันเป็นลิงค์ แต่ยังต้องการให้ปรากฏในรายการ (มีสไตล์ที่กำหนดเอง แต่ตัวอย่างนี้ง่าย)

<a [attr.href]="currentUrl !== link.url ? link.url : undefined">

สิ่งนี้สะอาดกว่าการใช้สอง * ng ถ้าฉันคิดว่าเป็นแท็กแบบช่วงชิงและจุดยึดฉันคิดว่า


5

หากเป็นองค์ประกอบอินพุตคุณสามารถเขียนได้เช่น ... <input type="radio" [checked]="condition">ค่าของเงื่อนไขต้องเป็นจริงหรือเท็จ

นอกจากนี้สำหรับคุณลักษณะสไตล์ ... <h4 [style.color]="'red'">Some text</h4>


4

คุณสามารถใช้สิ่งนี้

<span [attr.checked]="val? true : false"> </span>


คุณตรวจสอบค่าแอตทริบิวต์ด้วย 'val' ถ้ามันได้รับจริงแล้วเพียงแค่ผลตอบแทนที่แท้จริงมิฉะนั้นกลับมาเป็นเท็จค่า
WapShivam

1

คุณสามารถใช้วิธีการที่ดีกว่าสำหรับคนที่เขียน HTML สำหรับ scss ที่มีอยู่แล้ว
HTML

[attr.role]="<boolean>"

SCSS

[role = "true"] { ... }

ด้วยวิธีนี้คุณไม่จำเป็นต้องทำ<boolean> ? true : nullทุกครั้ง


มันไม่ทำงานในทุกกรณี ตัวอย่างเช่นมันไม่ทำงานกับmultipleคุณลักษณะในselectองค์ประกอบ
smartmouse


0

ผมอยากที่จะมีเคล็ดลับเฉพาะสำหรับสาขาเฉพาะเพิ่มเป็นด้านล่างในรหัส แต่คุณต้องการที่จะมีเคล็ดลับใน multiplent คุณสามารถมี valdidate อาร์เรย์โดยใช้:

องค์ประกอบหลายรายการมีแอตทริบิวต์data-tooltip ที่กำหนดเอง:

1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip '] รวม (ที่สำคัญ)

2: ['key1ToHaveTooltip', 'key2ToHaveTooltip']. indexOf (กุญแจ)> -1

มีคำแนะนำเครื่องมือในองค์ประกอบมากกว่า 1 องค์ประกอบ

   <div *ngFor="let key of Keys"
             [attr.data-tooltip]="key === 'IwantOnlyThisKeyToHaveTooltipAttribute' 
                                           ? 'Hey! I am a tooltip on key matched'
                                           : null">
   </div>

-7

Inline-Maps ก็มีประโยชน์เช่นกัน

พวกมันชัดเจนขึ้นและสามารถอ่านได้เช่นกัน

[class]="{ 'true': 'active', 'false': 'inactive', 'true&false': 'some-other-class' }[ trinaryBoolean ]"

อีกวิธีหนึ่งในการทำสิ่งเดียวกันให้สำเร็จในกรณีที่คุณไม่ชอบไวยากรณ์ที่สามหรือngIfs (ฯลฯ )


1
ชั้นเป็นสิ่งที่แตกต่างอย่างสิ้นเชิงแอตทริบิวต์ (สิ่งที่เป็นคำถามที่เกี่ยวกับ)
GünterZöchbauer

1
คุณสามารถใช้ความพยายามที่จะทำให้มันเป็นคำตอบที่ถูกต้องสำหรับคำถามจากนั้นฉันก็มีเหตุผลที่จะพิจารณาการลงคะแนนของฉันอีกครั้งและฉันยังสามารถ downvote โดยไม่เพิ่มความคิดเห็นเพื่อให้คุณอยู่ในความมืดเกี่ยวกับสิ่งที่ downvote
GünterZöchbauer

1
@Cody คุณสามารถอธิบาย (ให้รหัสตัวอย่าง) วิธีการของคุณที่จะทำงานกับcheckedคุณลักษณะ (เพิ่ม / ลบออกจากแท็กอินพุต) มี <input type="checkbox" name="vehicle" value="Car" checked>อะไรบ้าง? (ถ้าเราเปลี่ยนclassเป็นcheckboxรหัสของคุณมันไม่ทำงาน (ฉันตรวจสอบนี้))
Kamil Kiełczewski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.