Làm thế nào để thêm thuộc tính có điều kiện trong Angular 2?


276

Làm thế nào tôi có thể thêm một cách có điều kiện một thuộc tính phần tử, ví dụ như checkedhộp kiểm?

Các phiên bản trước của Angular đã có NgAttrvà tôi nghĩ NgCheckedtất cả dường như cung cấp chức năng mà tôi theo sau. Tuy nhiên, các thuộc tính này dường như không tồn tại trong Angular 2 và tôi thấy không có cách nào khác để cung cấp chức năng này.




2
nhân viên của Google, trong trường hợp bạn muốn một thuộc tính không có giá trị cho một thành phần góc, xem tại đây
Frank Nocke

Câu trả lời:


574

null loại bỏ nó:

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

hoặc là

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

Dấu:

Thuộc tính vs tài sản

Khi phần tử HTML nơi bạn thêm liên kết này không có thuộc tính với tên được sử dụng trong liên kết ( checkedtrong trường hợp này) và cũng không có thành phần hoặc lệnh Angular nào được áp dụng cho cùng một phần tử có @Input() checked;, sau đó[xxx]="..." không thể được sử dụng.

Xem thêm Sự khác biệt giữa các thuộc tính và thuộc tính trong HTML là gì?

Liên kết gì khi không có tài sản đó

Lựa chọn thay thế là [style.xxx]="...", [attr.xxx]="...", [class.xxx]="..."tùy thuộc vào những gì bạn cố gắng để đạt được.

Bởi vì <input>chỉ có một checkedthuộc tính, nhưng không có checkedtài sản [attr.checked]="..."là con đường phù hợp với trường hợp cụ thể này.

Các thuộc tính chỉ có thể xử lý các giá trị chuỗi

Một cạm bẫy phổ biến cũng là đối với [attr.xxx]="..."các ràng buộc, giá trị ( ...) luôn được xâu chuỗi. Chỉ các thuộc tính và @Input()s mới có thể nhận các loại giá trị khác như boolean, number, object, ...

Phần lớn thuộc tính và thuộc tính của các yếu tố được kết nối và có cùng tên.

Kết nối thuộc tính thuộc tính

Khi bị ràng buộc với thuộc tính, thuộc tính cũng chỉ nhận được giá trị chuỗi từ thuộc tính.
Khi bị ràng buộc với thuộc tính, thuộc tính nhận giá trị được liên kết với nó (boolean, number, object, ...) và thuộc tính lại giá trị được xâu chuỗi.

Hai trường hợp tên thuộc tính và thuộc tính không khớp.

Angular đã được thay đổi kể từ đó và biết về những trường hợp đặc biệt này và xử lý chúng để bạn có thể liên kết với <label [for]="mặc dù không có tài sản nào như vậy tồn tại (tương tự colspan)


3
Bạn có thể bỏ qua "attr." tiếp đầu ngữ.
Filip Stachowiak

16
@FilipStachowiak sau đó nó sẽ không trở thành một thuộc tính. Có nhiều thuộc tính khác nhau trên nhiều phần tử trong đó chính phần tử phản ánh giá trị được liên kết với một thuộc tính với một thuộc tính (và cả hướng khác). Trong trường hợp này bạn không cần attr.. Nhưng nếu bạn muốn thêm một thuộc tính tùy chỉnh, bạn chắc chắn cần attr.tiền tố
Günter Zöchbauer

14
Để rõ ràng, bạn cần một attr.phần của điều này. Tôi đã cố gắng thiết lập [href]và chỉ muốn nó được đặt nếu hreftài sản của vật phẩm tồn tại. Nếu không có [attr.href]điều này sẽ thêm một href với giá trị 'null', khi được nhấp vào, sẽ làm mới trang hiện tại. [attr.href]Đã sửa nó.
dudewad

@dudewad điều đó không đúng với tôi. Nếu bạn đặt hreftrên một phần tử có thuộc hreftính, không cần sử dụng attr. Phải có một cái gì đó sai đi.
Günter Zöchbauer

@ günter-zöchbauer Vâng, tôi đang sử dụng Ng 4.x và <a [href]="item.href">nơi item.hrefkhông xác định (không phải là giá trị không xác định, nhưng thuộc tính hrefkhông tồn tại trên item) đã đặt hrefthuộc tính thành null. Tôi đã không đi sâu vào nguồn, bởi vì thật lòng tôi không quan tâm lắm vào thời điểm này (đây là một chi tiết nhỏ), nhưng attr.là một chỉ thị hoàn toàn khác và do đó nó hoạt động khác nhau không gây ngạc nhiên cho tôi.
dudewad

37

trong cú pháp thuộc tính angular-2 là

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

Đóng vai trò thuộc tính cho kết quả của biểu thức myAriaRole.

vì vậy có thể sử dụng như

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

9
Vấn đề ở đây là khi your expressionfalsethuộc tính trong DOM sẽ trông giống như <div checked="false">. Tôi không nghĩ rằng đây là hiệu ứng dự định.
Günter Zöchbauer

7
Cảm ơn nhưng tôi đã hỏi làm thế nào để thêm thuộc tính một cách có điều kiện, không gán giá trị của nó một cách có điều kiện.
Jonathan Miles

Bạn thậm chí có thể bỏ qua "attr." tiếp đầu ngữ.
Filip Stachowiak

1
@FilipStachowiak sau đó nó sẽ không trở thành một thuộc tính. Có nhiều thuộc tính khác nhau trên nhiều phần tử trong đó chính phần tử phản ánh giá trị được liên kết với một thuộc tính với một thuộc tính (và cả hướng khác). Trong trường hợp này bạn không cần attr.. Nhưng nếu bạn muốn thêm một thuộc tính tùy chỉnh, bạn chắc chắn cần attr.tiền tố
Günter Zöchbauer

oh, điều này: null là tuyệt vời, điều biết rằng điều này có thể được sử dụng trong điều kiện! cảm ơn giải pháp
pinarella

17

Tinh chỉnh câu trả lời của Günter Zöchbauer:

Điều này dường như là khác nhau bây giờ. Tôi đã cố gắng làm điều này để áp dụng có điều kiện một thuộc tính href cho thẻ neo. Bạn phải sử dụng không xác định cho trường hợp 'không áp dụng'. Ví dụ, tôi sẽ chứng minh bằng một liên kết có điều kiện áp dụng thuộc tính href.

Thẻ neo không có thuộc tính href trở thành văn bản thuần túy, biểu thị một trình giữ chỗ cho một liên kết, theo thông số siêu liên kết .

Đối với điều hướng của tôi, tôi có một danh sách các liên kết, nhưng một trong những liên kết đó đại diện cho trang hiện tại. Tôi không muốn liên kết trang hiện tại là một liên kết, nhưng vẫn muốn nó xuất hiện trong danh sách (nó có một số kiểu tùy chỉnh, nhưng ví dụ này được đơn giản hóa).

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

Điều này sạch hơn so với sử dụng hai * ngNếu trên thẻ span và neo, tôi nghĩ vậy.


4

Nếu đó là một yếu tố đầu vào, bạn có thể viết một cái gì đó như .... <input type="radio" [checked]="condition">Giá trị của điều kiện phải đúng hoặc sai.

Ngoài ra đối với thuộc tính kiểu ... <h4 [style.color]="'red'">Some text</h4>


4

bạn có thể sử dụng cái này

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


Bạn đã kiểm tra giá trị thuộc tính của mình với 'val'. nếu nó đúng thì đơn giản là trả về true nếu không trả về giá trị sai
WapShivam

1

Bạn có thể sử dụng một cách tiếp cận tốt hơn cho ai đó viết HTML cho một scss đã tồn tại.
html

[attr.role]="<boolean>"

scss

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

Theo cách đó, bạn không cần phải luôn <boolean> ? true : nullluôn như vậy.


Điều này không hoạt động trong mọi trường hợp. Ví dụ, nó không hoạt động với multiplethuộc tính trên selectphần tử.
smartmouse

0

Ở đây, đoạn văn chỉ được in 'isValid' là đúng / nó chứa bất kỳ giá trị nào

<p *ngIf="isValid ? true : false">Paragraph</p>

0

Tôi muốn có tooltip chỉ cho một lĩnh vực cụ thể như thêm dưới đây trong mã nhưng bạn muốn có tooltip trên multiplent bạn có thể có một valdidate mảng sử dụng:

Nhiều yếu tố thuộc tính data-tooltip tùy chỉnh :

1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip ']. Bao gồm (khóa)

2: ['key1ToHaveTooltip', 'key2ToHaveTooltip']. IndexOf (khóa)> -1

để có thuộc tính tooltip trên hơn 1 phần tử.

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

-7

Inline-Maps cũng tiện dụng.

Chúng rõ ràng hơn một chút và cũng dễ đọc hơn.

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

Chỉ là một cách khác để thực hiện điều tương tự, trong trường hợp bạn không thích cú pháp tạm thời hoặc ngIfs (vv).


1
Một lớp là một cái gì đó hoàn toàn khác với một thuộc tính (câu hỏi là gì)
Günter Zöchbauer

1
Bạn cũng có thể nỗ lực để làm cho nó trở thành một câu trả lời thích hợp cho câu hỏi sau đó tôi có lý do để xem xét lại phiếu bầu của mình và tôi cũng có thể hạ cấp mà không cần thêm một bình luận để giữ cho bạn trong bóng tối về những gì downvote đã làm.
Günter Zöchbauer

1
@Cody bạn có thể giải thích (đưa ra mã ví dụ) phương thức của bạn sẽ hoạt động như thế nào với checkedthuộc tính (thêm / xóa nó khỏi thẻ đầu vào) <input type="checkbox" name="vehicle" value="Car" checked>không? (nếu chúng tôi đổi classthành checkboxmã của bạn thì nó KHÔNG hoạt động (tôi kiểm tra cái này))
Kamil Kiełczewski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.