Saya mengalami masalah dengan mencoba menggunakan Angular *ngFor
dan *ngIf
pada elemen yang sama.
Saat mencoba untuk mengulang koleksi di *ngFor
, koleksi dilihat sebagai null
dan akibatnya gagal ketika mencoba mengakses propertinya di templat.
@Component({
selector: 'shell',
template: `
<h3>Shell</h3><button (click)="toggle()">Toggle!</button>
<div *ngIf="show" *ngFor="let thing of stuff">
{{log(thing)}}
<span>{{thing.name}}</span>
</div>
`
})
export class ShellComponent implements OnInit {
public stuff:any[] = [];
public show:boolean = false;
constructor() {}
ngOnInit() {
this.stuff = [
{ name: 'abc', id: 1 },
{ name: 'huo', id: 2 },
{ name: 'bar', id: 3 },
{ name: 'foo', id: 4 },
{ name: 'thing', id: 5 },
{ name: 'other', id: 6 },
]
}
toggle() {
this.show = !this.show;
}
log(thing) {
console.log(thing);
}
}
Saya tahu solusi mudahnya adalah *ngIf
naik level tetapi untuk skenario seperti pengulangan item daftar ul
, saya akan berakhir dengan kosong li
jika koleksinya kosong, atau saya li
dibungkus dengan elemen kontainer yang berlebihan.
Contoh di plnkr ini .
Perhatikan kesalahan konsol:
EXCEPTION: TypeError: Cannot read property 'name' of null in [{{thing.name}} in ShellComponent@5:12]
Apakah saya melakukan sesuatu yang salah atau ini bug?
angular
ngfor
angular-ng-if
Garethdn
sumber
sumber
Jawaban:
V2 sudut tidak mendukung lebih dari satu arahan struktural pada elemen yang sama.
Sebagai solusinya gunakan
<ng-container>
elemen yang memungkinkan Anda untuk menggunakan elemen terpisah untuk setiap arahan struktural, tetapi tidak dicap ke DOM .<ng-template>
(<template>
Sebelum Angular v4) memungkinkan untuk melakukan hal yang sama tetapi dengan sintaks berbeda yang membingungkan dan tidak lagi direkomendasikansumber
ngFor
di<ng-container>
elemen danngIf
di<div>
. Anda juga dapat memiliki dua sarang yang<ng-container>
dibungkus<div>
.<ng-container>
hanyalah elemen pembantu yang tidak akan ditambahkan ke DOM.<ng-container>
. Berperilaku sama seperti<template>
tetapi memungkinkan untuk menggunakan sintaks "normal" untuk arahan struktural.Seperti yang semua orang tunjukkan meskipun memiliki beberapa arahan template dalam satu elemen berfungsi dalam angular 1.x itu tidak diizinkan dalam Angular 2. Anda dapat menemukan lebih banyak info dari sini: https://github.com/angular/angular/issues/ 7315
2016 sudut 2 beta
solusinya adalah dengan menggunakan
<template>
sebagai pengganti, jadi kodenya seperti initetapi untuk beberapa alasan di atas tidak berfungsi
2.0.0-rc.4
jika Anda dapat menggunakan iniJawaban Diperbarui 2018
Dengan pembaruan, sekarang di 2018 angular v6 merekomendasikan untuk menggunakan,
<ng-container>
bukan<template>
jadi inilah jawaban yang diperbarui.
sumber
Seperti @Zyzle sebutkan, dan @ Günter disebutkan dalam komentar ( https://github.com/angular/angular/issues/7315 ), ini tidak didukung.
Dengan
tidak ada
<li>
elemen kosong ketika daftar kosong. Bahkan<ul>
elemen tidak ada (seperti yang diharapkan).Ketika daftar diisi, tidak ada elemen wadah yang berlebihan.
The github diskusi (4792) yang @Zyzle disebutkan dalam komentarnya juga menyajikan solusi lain menggunakan
<template>
(di bawah Saya menggunakan markup asli Anda - menggunakan<div>
s):Solusi ini juga tidak memperkenalkan elemen wadah ekstra / berlebihan.
sumber
<template>
adalah cara untuk menambahkan elemen induk yang tidak akan muncul di output.dalam html:
dalam css:
sumber
Anda tidak dapat memiliki
ngFor
danngIf
pada elemen yang sama. Apa yang bisa Anda lakukan adalah menunda mengisi array yang Anda gunakanngFor
sampai sakelar pada contoh Anda diklik.Inilah cara dasar (tidak hebat) yang bisa Anda lakukan: http://plnkr.co/edit/Pylx5HSWIZ7ahoC7wT6P
sumber
you can't
bukan jawaban yang baik, tidakkah Anda setuju?Anda tidak dapat menggunakan lebih dari satu
Structural Directive
di Angular pada elemen yang sama, itu membuat kebingungan dan struktur yang buruk, jadi Anda perlu menerapkannya dalam 2 elemen bersarang terpisah (atau Anda dapat menggunakanng-container
), baca pernyataan ini dari tim Angular:Jadi Anda dapat menggunakan
ng-container
(Angular4) sebagai pembungkus (akan dihapus dari dom) atau div atau rentang jika Anda memiliki kelas atau atribut lainnya seperti di bawah ini:sumber
Ini akan berfungsi tetapi elemennya masih di DOM.
sumber
Tabel di bawah ini hanya mencantumkan item yang memiliki set nilai "pemula". Membutuhkan keduanya
*ngFor
dan*ngIf
untuk mencegah baris yang tidak diinginkan dalam html.Awalnya memiliki
*ngIf
dan*ngFor
pada<tr>
tag yang sama , tetapi tidak berfungsi. Menambahkan<div>
untuk*ngFor
loop dan ditempatkan*ngIf
di<tr>
tag, berfungsi seperti yang diharapkan.sumber
<div>
di dalam meja adalah ide goos, terutama ketika ada alternatif yang lebih baik. Sudahkah Anda memeriksa apakah dengan demikian bekerja di IE yang terutama pilih-pilih elemen di<table>
Diperbarui ke angular2 beta 8
Sekarang mulai dari angular2 beta 8 kita bisa menggunakan
*ngIf
dan*ngFor
pada komponen yang sama lihat di sini .Bergantian:
Terkadang kami tidak dapat menggunakan tag HTML di dalam yang lain seperti di
tr
,th
(table
) atau dili
(ul
). Kami tidak dapat menggunakan tag HTML lain tetapi kami harus melakukan beberapa tindakan dalam situasi yang sama sehingga kami dapat menggunakan tag fitur HTML5<template>
dengan cara ini.ngFor menggunakan templat:
ngIf menggunakan templat:
Untuk informasi lebih lanjut tentang arahan struktural di angular2 lihat di sini .
sumber
sumber
Anda juga dapat menggunakan
ng-template
(alih-alih templat. Lihat catatan untuk peringatan menggunakan tag templat) untuk menerapkan * ngFor dan ngIf pada elemen HTML yang sama. Berikut adalah contoh di mana Anda dapat menggunakan * ngIf dan * ngFor untuk elemen tr yang sama di tabel sudut.mana
fruiArray = ['apple', 'banana', 'mango', 'pineapple']
.catatan:
Peringatan menggunakan
template
tag bukanng-template
tag adalah bahwa ia melemparStaticInjectionError
di beberapa tempat.sumber
sumber
Anda tidak dapat menggunakan banyak arahan struktural pada elemen yang sama. Bungkus elemen Anda
ng-template
dan gunakan satu arahan struktural di sanasumber
Anda dapat melakukan ini dengan cara lain dengan memeriksa panjang array
sumber
app.component.ts
app.component.html
Keluaran
sumber