Saya mencoba melakukan beberapa hal dalam Angular 2 Alpha 28, dan saya mengalami masalah dengan kamus dan NgFor.
Saya memiliki antarmuka dalam TypeScript yang terlihat seperti ini:
interface Dictionary {
[ index: string ]: string
}
Dalam JavaScript ini akan menerjemahkan ke objek yang dengan data mungkin terlihat seperti ini:
myDict={'key1':'value1','key2':'value2'}
Saya ingin mengulangi ini dan mencoba ini:
<div *ngFor="(#key, #value) of myDict">{{key}}:{{value}}</div>
Tetapi tidak berhasil, tidak ada yang di bawah ini yang berfungsi:
<div *ngFor="#value of myDict">{{value}}</div>
<div *ngFor="#value of myDict #key=index">{{key}}:{{value}}</div>
Dalam semua kasus, saya mendapatkan kesalahan seperti "Token tak terduga" atau "Tidak dapat menemukan objek pendukung pipa 'iterableDiff'"
Apa yang kulewatkan di sini? Apakah ini tidak mungkin lagi? (Sintaks pertama bekerja di Angular 1.x) atau apakah sintaks berbeda untuk iterasi pada objek?
Jawaban:
Tampaknya mereka tidak ingin mendukung sintaks dari ng1.
Menurut Miško Hevery ( referensi ):
Jadi untuk beralih pada objek Anda, Anda perlu menggunakan "pipa". Saat ini tidak ada pipa yang diimplementasikan yang melakukan itu.
Sebagai solusinya, berikut adalah contoh kecil yang beralih di atas kunci:
Komponen:
sumber
key
asnumber
danvalue
asstring
tetapi sudut adalah melempar kesalahanexpression has changed after it was checked
? mengapa begitu ide?6.1.1+ Angular Jawab
Gunakan built-in
keyvalue
-pipe seperti ini:atau seperti ini:
di mana
mySortingFunction
di.ts
file Anda , misalnya:Stackblitz: https://stackblitz.com/edit/angular-iterate-key-value
Anda tidak perlu mendaftarkan ini dalam modul apa pun, karena pipa Angular bekerja di luar kotak dalam template apa pun.
Ini juga berfungsi untuk Javascript-Maps .
sumber
implements PipeTransform
definisi kelas (lihat angular.io/guide/pipes#custom-pipes )return Object.keys(dict).map(key => ({key, val: dict[key]}))
?coba gunakan pipa ini
sumber
Selain jawaban @ obscur, berikut adalah contoh bagaimana Anda dapat mengakses
key
danvalue
dari @View.Pipa:
Melihat:
Jadi jika objeknya terlihat seperti:
Hasil yang dihasilkan adalah:
Nama depan: Daario
Nama Belakang: Naharis
Nama depan: Victarion
Nama Belakang: Greyjoy
Nama depan: Quentyn
Nama Belakang: Ball
sumber
<li *ngFor="let u of myObject | keyValueFilter">First Name: {{u.key}} <br> Last Name: {{u.value}}</li>
. +1 dari saya.return { 'key' : key, 'value' : value[key] };
Diperbarui: Angular sekarang menyediakan pipa untuk melompat melalui Objek json melalui
keyvalue
:DEMO KERJA , dan untuk lebih detail Baca
Sebelumnya (Untuk Versi Lama): Sampai sekarang jawaban terbaik / terpendek yang saya temukan adalah (Tanpa Filter Pipa atau fungsi Kustom dari Sisi Komponen)
DEMO KERJA
sumber
let item of myDict | keyvalue
ini menyelesaikan masalah saya.Menambahkan ke jawaban SimonHawesome yang luar biasa . Saya telah membuat versi ringkas yang menggunakan beberapa fitur naskah baru. Saya menyadari bahwa versi SimonHawesome sengaja dibuat untuk menjelaskan rincian yang mendasarinya. Saya juga telah menambahkan pemeriksaan awal agar pipa berfungsi untuk nilai falsy . Misal, jika peta itu
null
.Perhatikan bahwa menggunakan transformasi iterator (seperti yang dilakukan di sini) dapat lebih efisien karena kita tidak perlu mengalokasikan memori untuk array sementara (seperti yang dilakukan dalam beberapa jawaban lain).
sumber
PipeTransform
Berikut variasi pada beberapa jawaban di atas yang mendukung banyak transformasi (keyval, key, value):
Pemakaian
sumber
pure: false
sangat penting untuk refleksi instan.Saya memiliki masalah serupa, membuat sesuatu untuk objek dan Maps.
sumber
implements PipeTransform
definisi kelasAngular 2.x && Angular 4.x tidak mendukung ini di luar kotak
Anda dapat menggunakan dua pipa ini untuk beralih dengan kunci atau nilai .
Pipa kunci:
Nilai pipa:
Cara Penggunaan:
sumber
Jika seseorang bertanya-tanya bagaimana cara bekerja dengan objek multidimensi, inilah solusinya.
mari kita asumsikan kita memiliki objek berikut dalam layanan
dalam komponen tambahkan fungsi berikut
Akhirnya dalam pandangan lakukan mengikuti
sumber
Saya telah merobek rambut saya dengan mencoba mengurai dan menggunakan data yang dikembalikan dari permintaan JSON / panggilan api. Saya tidak yakin persis di mana saya salah, saya merasa seperti saya telah melingkari jawaban selama berhari-hari, mengejar berbagai kode kesalahan seperti:
"Tidak dapat menemukan objek pendukung pipa 'iterableDiff'"
"Generic TYpe Array membutuhkan satu argumen"
Kesalahan JSON parsing, dan saya yakin orang lain
Saya berasumsi saya baru saja salah kombinasi perbaikan.
Jadi, inilah sedikit ringkasan tentang gotcha dan hal-hal yang harus dicari.
Pertama-tama periksa hasil panggilan api Anda, hasil Anda mungkin dalam bentuk objek, array, atau array objek.
saya tidak akan membahasnya terlalu banyak, cukup untuk mengatakan Kesalahan asli OP karena tidak dapat diubah umumnya disebabkan oleh Anda mencoba untuk mengulangi objek, bukan Array.
Inilah beberapa hasil debug saya yang menunjukkan variabel array dan objek
Jadi karena kami umumnya ingin mengulangi hasil JSON kami, kami perlu memastikannya dalam bentuk Array. Saya mencoba banyak contoh, dan mungkin mengetahui apa yang saya tahu sekarang beberapa dari mereka sebenarnya akan bekerja, tetapi pendekatan yang saya lakukan adalah dengan mengimplementasikan pipa dan kode yang saya gunakan adalah yang diposting oleh t.888
Jujur saya pikir salah satu hal yang membuat saya kurang penanganan kesalahan, dengan menambahkan panggilan 'kembali tidak terdefinisi' saya percaya kita sekarang memungkinkan data yang tidak diharapkan untuk dikirim ke pipa, yang jelas terjadi dalam kasus saya .
jika Anda tidak ingin berurusan dengan argumen ke pipa (dan lihat saya pikir itu tidak perlu dalam kebanyakan kasus) Anda bisa mengembalikan yang berikut ini
Beberapa Catatan tentang membuat pipa dan halaman atau komponen Anda yang menggunakan pipa itu
adalah saya menerima kesalahan tentang 'name_of_my_pipe' tidak ditemukan
Gunakan perintah 'menghasilkan pipa ion' dari CLI untuk memastikan modul pipa.ts dibuat dan dirujuk dengan benar. pastikan Anda menambahkan yang berikut ke halaman mypage.module.ts.
(tidak yakin apakah ini berubah jika Anda juga memiliki custom_module Anda sendiri, Anda mungkin perlu menambahkannya ke custommodule.module.ts)
jika Anda menggunakan perintah 'menghasilkan halaman ion' untuk membuat halaman Anda, tetapi memutuskan untuk menggunakan halaman itu sebagai halaman utama Anda, ingatlah untuk menghapus referensi halaman dari app.module.ts (inilah jawaban lain yang saya posting berurusan dengan itu https: / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
Dalam mencari jawaban ada beberapa cara untuk menampilkan data dalam file html, dan saya tidak cukup mengerti untuk menjelaskan perbedaannya. Anda mungkin merasa lebih baik untuk menggunakan satu sama lain dalam skenario tertentu.
Namun apa yang berhasil yang memungkinkan saya untuk menampilkan nilai dan kuncinya adalah sebagai berikut:
untuk membuat panggilan API sepertinya Anda perlu mengimpor HttpModule ke app.module.ts
dan Anda memerlukan Http di laman tempat Anda menelepon
Saat melakukan panggilan API, Anda tampaknya bisa mendapatkan data anak-anak (objek atau array dalam array) 2 cara berbeda, entah itu berfungsi
baik saat panggilan berlangsung
atau ketika Anda menetapkan data ke variabel lokal Anda
(tidak yakin apakah variabel itu perlu menjadi Array String, tapi itulah yang saya miliki saat ini. Mungkin berfungsi sebagai variabel yang lebih umum)
Dan catatan terakhir, itu tidak perlu untuk menggunakan perpustakaan JSON inbuilt namun Anda mungkin menemukan 2 panggilan ini berguna untuk mengkonversi dari objek ke string dan vica sebaliknya
Saya harap kompilasi informasi ini membantu seseorang.
sumber
sumber
Antarmuka dalam TypeScript adalah konstruksi waktu dev (murni untuk tooling ... 0 dampak runtime). Anda harus menulis TypeScript yang sama dengan JavaScript Anda.
sumber
Kamus adalah objek, bukan array. Saya percaya ng-repeat membutuhkan array di Angular 2.
Solusi paling sederhana adalah dengan membuat pipa / filter yang mengubah objek menjadi array dengan cepat. Yang mengatakan, Anda mungkin ingin menggunakan array seperti kata @basarat.
sumber
Jika Anda memiliki
es6-shim
atautsconfig.json
targetes6
Anda, Anda bisa menggunakan ES6 Map untuk membuatnya.sumber
Tentukan
MapValuesPipe
dan implementasikan PipeTransform :Tambahkan pipa Anda di modul pipa Anda. Ini penting jika Anda perlu menggunakan pipa yang sama di lebih dari satu komponen :
Maka cukup gunakan pipa di html Anda dengan
*ngFor
:<tr *ngFor="let attribute of mMap | mapValuesPipe">
Ingat, Anda harus mendeklarasikan PipesModule Anda di komponen tempat Anda ingin menggunakan pipa:
sumber
Jadi saya akan mengimplementasikan fungsi pembantu saya sendiri, objLength (obj), yang mengembalikan hanya Object (obj) .keys.length. Tetapi kemudian ketika saya menambahkannya ke fungsi template * ngIf, IDE saya menyarankan objectKeys (). Saya mencobanya, dan berhasil. Setelah deklarasi, tampaknya ditawarkan oleh lib.es5.d.ts, jadi begitulah!
Inilah cara saya mengimplementasikannya (Saya memiliki objek khusus yang menggunakan kunci yang dihasilkan sisi server sebagai indeks untuk file yang saya unggah):
sumber