Biến tham chiếu mẫu động bên trong ngFor (Angular 9)


97

Làm thế nào để khai báo một biến tham chiếu mẫu động bên trong một phần tử?ngFor

Tôi muốn sử dụng thành phần cửa sổ bật lên từ ng-bootstrap, mã cửa sổ bật lên (có ràng buộc Html) như được hiển thị:

<ng-template #popContent>Hello, <b>{{name}}</b>!</ng-template>
<button type="button" class="btn btn-secondary" [ngbPopover]="popContent" popoverTitle="Fancy content">
    I've got markup and bindings in my popover!
</button>

Làm thế nào tôi có thể bọc các yếu tố đó bên trong ngFor?

<div *ngFor="let member of members">
    <!-- how to declare the '????' -->
    <ng-template #????>Hello, <b>{{member.name}}</b>!</ng-template>
        <button type="button" class="btn btn-secondary" [ngbPopover]="????" popoverTitle="Fancy content">
        I've got markup and bindings in my popover!
    </button>
</div>

Hmmm ... có ý kiến ​​gì không?


Không có cái gọi là biến tham chiếu động. Bạn nghĩ tại sao nó cần phải năng động?
Günter Zöchbauer

vì hướng dẫn họ nói để có html ràng buộc bên trong một popover, sau đó chúng ta cần phải tạo ra một ng-templatevà tham khảo nó với biến mẫu tham khảo , nhưng bây giờ tôi muốn sử dụng popover này bên trong một ngForyếu tố
Boo Yan Jiong

8
Chỉ cần làm như vậy. Biến mẫu sẽ khác nhau đối với mỗi phần tử ngay cả khi nó có cùng tên.
Günter Zöchbauer

3
Điều gì xảy ra nếu bạn sử dụng cùng một ref cho mọi thứ? Bạn đã thử nghiệm nó chưa?
developer033

Ha, tôi chưa bao giờ nghĩ đến điều đó ... Tôi sẽ kiểm tra nó ngay bây giờ ... bởi vì tôi vẫn tiếp tục suy nghĩ về cách khai báo một biến tham chiếu mẫu ** với "index" ** ... sẽ cập nhật sau khi tôi kiểm tra nó. ..: D
Boo Yan Jiong

Câu trả lời:


101

Các biến tham chiếu mẫu nằm trong phạm vi khuôn mẫu mà chúng được định nghĩa. Một chỉ thị cấu trúc tạo ra một khuôn mẫu lồng nhau và do đó, giới thiệu một phạm vi riêng biệt.

Vì vậy, bạn chỉ có thể sử dụng một biến để tham chiếu mẫu của mình

<div *ngFor="let member of members">
  <ng-template #popupContent>Hello, <b>{{member.name}}</b>!</ng-template>
  <button type="button" class="btn btn-secondary" [ngbPopover]="popupContent" popoverTitle="Fancy content">
      I've got markup and bindings in my popover!
  </button>
</div>

và nó sẽ hoạt động vì nó đã được khai báo bên trong <ng-template ngFor

Ví dụ về Plunker

Để biết thêm chi tiết xem thêm:


1
Lưu ý rằng nếu bạn đang sử dụng một @ViewChild, bạn không thể sử dụng giải pháp này (và sau đó nên sử dụng giải pháp của @ AlexBoisselle)
ngẫu nhiên

18

Đây là giải pháp tốt nhất mà tôi đã tìm thấy: https://stackoverflow.com/a/40165639/3870815

Trong câu trả lời đó, họ sử dụng:

@ViewChildren('popContent') components:QueryList<CustomComponent>;

Để xây dựng danh sách các thành phần được tạo động đó. Rất khuyến khích bạn kiểm tra nó ra!


1
Câu trả lời tốt nhất!
IgG

1

Một cách khác để cho phép điều này là tạo một thành phần bao bọc nút và ng-template

<div *ngFor="let member of members">
    <popover-button [member]="member"></pop-over-button>
</div>

Và có phần sau trong thành phần nút bật lên

<ng-template #popContent>Hello, <b>{{member.name}}</b>!</ng-template>
    <button type="button" class="btn btn-secondary" [ngbPopover]="popContent" popoverTitle="Fancy content">
    I've got markup and bindings in my popover!
</button>

-1

Bạn có thể sử dụng trackBy: trackByFntrong*ngFor

<div *ngFor="let member of members;trackBy: trackByF">
    <ng-template #popupContent>Hello, <b>{{member.name}}</b>!</ng-template>
        <button type="button" class="btn btn-secondary" [ngbPopover]="popupContent" popoverTitle="Fancy content">
        I've got markup and bindings in my popover!
    </button>
</div>
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.