Saya menggunakan mat-table untuk membuat daftar konten bahasa yang dipilih pengguna. Mereka juga dapat menambahkan bahasa baru menggunakan panel dialog. Setelah mereka menambahkan bahasa dan kembali lagi. Saya ingin sumber data saya diperbarui untuk menunjukkan perubahan yang mereka buat.
Saya menginisialisasi datastore dengan mendapatkan data pengguna dari layanan dan meneruskannya ke sumber data dalam metode refresh.
Language.component.ts
import { Component, OnInit } from '@angular/core';
import { LanguageModel, LANGUAGE_DATA } from '../../../../models/language.model';
import { LanguageAddComponent } from './language-add/language-add.component';
import { AuthService } from '../../../../services/auth.service';
import { LanguageDataSource } from './language-data-source';
import { LevelbarComponent } from '../../../../directives/levelbar/levelbar.component';
import { DataSource } from '@angular/cdk/collections';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import { MatSnackBar, MatDialog } from '@angular/material';
@Component({
selector: 'app-language',
templateUrl: './language.component.html',
styleUrls: ['./language.component.scss']
})
export class LanguageComponent implements OnInit {
displayedColumns = ['name', 'native', 'code', 'level'];
teachDS: any;
user: any;
constructor(private authService: AuthService, private dialog: MatDialog) { }
ngOnInit() {
this.refresh();
}
add() {
this.dialog.open(LanguageAddComponent, {
data: { user: this.user },
}).afterClosed().subscribe(result => {
this.refresh();
});
}
refresh() {
this.authService.getAuthenticatedUser().subscribe((res) => {
this.user = res;
this.teachDS = new LanguageDataSource(this.user.profile.languages.teach);
});
}
}
bahasa-data-source.ts
import {MatPaginator, MatSort} from '@angular/material';
import {DataSource} from '@angular/cdk/collections';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/merge';
import 'rxjs/add/operator/map';
export class LanguageDataSource extends DataSource<any> {
constructor(private languages) {
super();
}
connect(): Observable<any> {
return Observable.of(this.languages);
}
disconnect() {
// No-op
}
}
Jadi saya telah mencoba memanggil metode penyegaran di mana saya mendapatkan pengguna dari backend lagi dan kemudian saya menginisialisasi ulang sumber data. Namun ini tidak berhasil, tidak ada perubahan yang terjadi.
Jawaban:
Pemicu deteksi perubahan dengan menggunakan
ChangeDetectorRef
dalamrefresh()
metode hanya setelah menerima data baru, menyuntikkan ChangeDetectorRef dalam konstruktor dan penggunaan detectChanges seperti ini:sumber
Saya tidak tahu apakah
ChangeDetectorRef
diperlukan saat pertanyaan dibuat, tetapi sekarang ini sudah cukup:Contoh:
StackBlitz
sumber
MatTableDataSource.paginator
properti setelah tampilan Paginator diinisialisasi. Lihat deskripsipaginator
properti di sini: material.angular.io/components/table/api#MatTableDataSourceJadi bagi saya, tidak ada yang memberikan jawaban yang baik untuk masalah yang saya temui yang hampir sama dengan @Kay. Bagi saya ini soal sortir, tidak terjadi perubahan pada meja sortir pada matras. Saya bertujuan jawaban ini karena ini satu-satunya topik yang saya temukan dengan mencari di google. Saya menggunakan Angular 6.
Seperti yang dikatakan di sini :
Jadi Anda hanya perlu memanggil renderRows () dalam metode refresh () untuk membuat perubahan Anda muncul.
Lihat di sini untuk integrasi.
sumber
Karena Anda menggunakan
MatPaginator
, Anda hanya perlu melakukan perubahan apa pun ke paginator, ini memicu pemuatan ulang data.Trik sederhana:
Ini memperbarui ukuran halaman ke ukuran halaman saat ini, jadi pada dasarnya tidak ada yang berubah, kecuali
_emitPageEvent()
fungsi pribadi dipanggil juga, memicu pemuatan ulang tabel.sumber
_changePageSize()
bukankah publik benar? Apakah ini aman untuk digunakan? Selengkapnya tentang stackoverflow.com/questions/59093781/…Tambahkan baris ini di bawah tindakan Anda menambah atau menghapus baris tertentu.
sumber
Cara terbaik untuk melakukannya adalah dengan menambahkan observasi tambahan ke penerapan Sumber Data Anda.
Dalam metode hubungkan, Anda seharusnya sudah menggunakan
Observable.merge
untuk berlangganan larik observabel yang menyertakan paginator.page, sort.sortChange, dll. Anda dapat menambahkan subjek baru ke ini dan memanggilnya berikutnya saat Anda perlu membuat penyegaran.sesuatu seperti ini:
Dan kemudian Anda dapat menelepon
recordChange$.next()
untuk memulai penyegaran.Secara alami saya akan membungkus panggilan dalam metode refresh () dan membatalkannya dari contoh sumber data w / dalam komponen, dan teknik yang tepat lainnya.
sumber
Property 'connect' in type 'customDataSource<T>' is not assignable to the same property in base type 'MatTableDataSource<T>'. Type '() => Observable<any>' is not assignable to type '() => BehaviorSubject<T[]>'. Type 'Observable<any>' is not assignable to type 'BehaviorSubject<T[]>'. Property '_value' is missing in type 'Observable<any>'.
Anda cukup menggunakan fungsi menghubungkan sumber data
seperti itu. 'data' menjadi nilai baru untuk datatable
sumber
Anda dapat dengan mudah memperbarui data tabel menggunakan "concat":
sebagai contoh:
language.component.ts
language.component.html
Dan, saat Anda memperbarui data (language.component.ts):
Saat Anda menggunakan "concat" angular mendeteksi perubahan objek (this.teachDS) dan Anda tidak perlu menggunakan hal lain.
PD: Ini bekerja untuk saya di sudut 6 dan 7, saya tidak mencoba versi lain.
sumber
Anda juga bisa menggunakan metode renderRows ().
@ViewChild (MatTable, {static: false}) tabel: MatTable // inisialisasi
lalu this.table.renderRows ();
untuk referensi, periksa ini -: https://www.freakyjolly.com/angular-7-8-edit-add-delete-rows-in-material-table-with-using-dialogs-inline-row-operation/
sumber
Nah, saya mengalami masalah serupa di mana saya menambahkan sesuatu ke sumber data dan tidak memuat ulang.
Cara termudah yang saya temukan adalah dengan menetapkan ulang data
sumber
Di Angular 9, rahasianya adalah
this.dataSource.data = this.dataSource.data;
Contoh:
sumber
Saya mencapai solusi yang baik dengan menggunakan dua sumber:
menyegarkan dataSource dan paginator:
di mana misalnya dataSource didefinisikan di sini:
sumber
sumber
dalam kasus saya (Angular 6+), saya mewarisi dari
MatTableDataSource
untuk membuatMyDataSource
. Tanpa menelepon setelahnyathis.data = someArray
data di mana tidak ditampilkan
kelas MyDataSource
sumber
Ada dua cara untuk melakukannya karena Angular Material tidak konsisten, dan ini didokumentasikan dengan sangat buruk. Tabel material sudut tidak akan diperbarui ketika baris baru akan tiba. Anehnya, hal itu dikatakan karena masalah kinerja. Tapi sepertinya masalah desain, mereka tidak bisa berubah. Ini diharapkan untuk tabel untuk memperbarui ketika baris baru terjadi. Jika perilaku ini tidak boleh diaktifkan secara default, harus ada tombol untuk menonaktifkannya.
Bagaimanapun, kami tidak dapat mengubah Material Angular. Tetapi pada dasarnya kita dapat menggunakan metode yang terdokumentasi dengan sangat buruk untuk melakukannya:
Satu - jika Anda menggunakan array secara langsung sebagai sumber:
di mana tabel adalah ViewChild dari mat-table
Kedua - jika Anda menggunakan penyortiran dan fitur lainnya
table.renderRows () secara mengejutkan tidak akan berfungsi. Karena mat-table tidak konsisten di sini. Anda perlu menggunakan retasan untuk memberi tahu sumbernya berubah. Anda melakukannya dengan metode ini:
di mana dataSource adalah pembungkus MatTableDataSource yang digunakan untuk pengurutan dan fitur lainnya.
sumber
Ini berhasil untuk saya:
sumber
Saya pikir
MatTableDataSource
objek tersebut terhubung dengan array data yang Anda berikan keMatTableDataSource
konstruktor.Misalnya:
Jadi, ketika Anda harus mengubah data; perubahan pada daftar asli
dataTable
dan kemudian mencerminkan perubahan pada tabel dengan_updateChangeSubscription()
metode panggilan aktiftableDS
.Misalnya:
Itu berhasil dengan saya melalui Angular 6.
sumber
_
dan Anda menyebutnya?Ini berhasil untuk saya:
Jadi, Anda harus mendeklarasikan instance sumber data Anda sebagai
MatTableDataSource
sumber
Saya melakukan beberapa penelitian lebih lanjut dan menemukan tempat ini untuk memberi saya apa yang saya butuhkan - terasa bersih dan terkait dengan pembaruan data saat di-refresh dari server: https://blog.angular-university.io/angular-material-data-table/
Sebagian besar kredit untuk halaman di atas. Di bawah ini adalah contoh bagaimana mat-selector dapat digunakan untuk memperbarui mat-table yang terikat ke sumber data pada saat perubahan pilihan. Saya menggunakan Angular 7. Maaf karena ekstensif, mencoba untuk menjadi lengkap tapi ringkas - Saya telah merobek sebanyak mungkin bagian yang tidak diperlukan. Dengan harapan ini dapat membantu orang lain maju lebih cepat!
organization.model.ts:
organization.service.ts:
organizationdatasource.model.ts:
organization.component.html:
organization.component.scss:
organization.component.ts:
sumber
Setelah membaca Tabel Material tidak memperbarui pembaruan data pos # 11638 Laporan Bug saya menemukan yang terbaik (baca, solusi termudah) adalah seperti yang disarankan oleh komentator terakhir 'shhdharmen' dengan saran untuk menggunakan EventEmitter.
Ini melibatkan beberapa perubahan sederhana pada kelas sumber data yang dihasilkan
yaitu) menambahkan variabel privat baru ke kelas sumber data Anda
dan di mana saya mendorong data baru ke array internal (this.data), saya memancarkan acara.
dan terakhir, ubah larik 'dataMutation' dalam metode 'hubungkan' - sebagai berikut
sumber
// ini adalah dataSource
this.guests = [];
this.guests.push ({id: 1, name: 'Ricardo'});
// segarkan dataSource this.guests = Array.from (this.guest);
sumber
Saya merilis perpustakaan yang bertujuan untuk menjadi Sumber Data Material resmi di masa depan, mendukung semua jenis aliran input (urutkan, pagination, filter), dan beberapa konfigurasi dengan debugging untuk melihat cara kerjanya saat Anda sedang melakukan coding.
Anda dapat menemukan demo StackBlitz dan informasi lebih lanjut di sini:
https://medium.com/@matheo/reactive-datasource-for-angular-1d869b0155f6
Saya akan senang mendengar pendapat Anda dan mendukung kasus penggunaan Anda jika perlu.
Selamat membuat kode!
sumber
Saya telah mencoba ChangeDetectorRef, Subject dan BehaviourSubject tetapi apa yang berhasil untuk saya
sumber