Sau vài tuần của Googling và chỉ có một câu hỏi Stackoverflown cho đến nay cuối cùng tôi đã xây dựng được Angular CRUD App sử dụng Thành phần bảng vật liệu của mình. Nó cho thấy dữ liệu từ backend (JSON) và cho các hoạt động CRUD tôi đang sử dụng các hộp thoại như một hiển thị trên hình ảnh (đây là chỉnh sửa, xin lỗi cho Croatia). Hộp thoại có thể không phải là cách tốt nhất để thực hiện, chỉnh sửa nội tuyến có thể tốt hơn. Tuy nhiên, để thêm mục mới, bạn cần một cái gì đó giống như hộp thoại.Góc - Bảng vật liệu, có thể cập nhật các hàng mà không làm mới toàn bộ bảng không?
Điều cuối cùng tôi bị mắc kẹt là cách cập nhật các trường trong bảng tương ứng. Vì vậy, khi bạn nhấn 'Lưu' trên hộp thoại, dữ liệu sẽ được cập nhật trong chương trình phụ trợ (trong bảng MySQL) nhưng không được đặt trước. Trong thời gian này tôi có cách giải quyết xấu cho việc này, mỗi lần bạn cập nhật, nó cũng làm mới toàn bộ bảng.
Dù sao đây là mã:
phần Bảng:
export class BazaComponent implements OnInit {
....
constructor(public httpClient: HttpClient, public dialog: MatDialog) {
}
ngOnInit() {
this.loadData();
}
// TODO: Simplfy this...
addNew(ident: number, naziv: string, mt: number, kutija: number,
komada: number, jm: string, orginal: number, lokacija: number, napomena: string) {
console.log('add new clicked');
const dialogRef = this.dialog.open(AddDialogComponent, {
data: {ident: ident, naziv: naziv, mt: mt, kutija: kutija,
komada: komada, jm: jm, orginal: orginal, lokacija: lokacija, napomena: napomena }
});
dialogRef.afterClosed().subscribe(result => {
console.log(result);
if (result === 1) {
this.loadData(); // --> This is a temp workaround, every time when I do CRUD operation just redraw whole thing again
}
});
}
startEdit(id: number, ident: number, naziv: string, mt: number, kutija: number,
komada: number, jm: string, orginal: number, lokacija: number, napomena: string) {
const dialogRef = this.dialog.open(EditDialogComponent, {
data: {id: id, ident: ident, naziv: naziv, mt: mt, kutija: kutija,
komada: komada, jm: jm, orginal: orginal, lokacija: lokacija, napomena: napomena}
});
dialogRef.afterClosed().subscribe(result => {
if (result === 1) {
this.loadData(); // --> This is a temp workaround, every time when I do CRUD operation just redraw whole thing again
}
});
}
deleteItem(id: number, ident: number, naziv: string, mt: number) {
const dialogRef = this.dialog.open(DeleteDialogComponent, {
data: {id: id, ident: ident, naziv: naziv, mt: mt}
});
dialogRef.afterClosed().subscribe(result => {
if (result === 1) {
this.loadData();
}
});
}
public loadData() {
this.exampleDatabase = new DataService(this.httpClient);
this.dataSource = new ExampleDataSource(this.exampleDatabase, this.paginator, this.sort);
Observable.fromEvent(this.filter.nativeElement, 'keyup')
.debounceTime(150)
.distinctUntilChanged()
.subscribe(() => {
if (!this.dataSource) {
return;
}
this.dataSource.filter = this.filter.nativeElement.value;
});
}
}
export class ExampleDataSource extends DataSource<Baza> {
_filterChange = new BehaviorSubject('');
get filter(): string {
return this._filterChange.value;
}
set filter(filter: string) {
this._filterChange.next(filter);
}
filteredData: Baza[] = [];
renderedData: Baza[] = [];
constructor(private _exampleDatabase: DataService,
private _paginator: MatPaginator,
private _sort: MatSort) {
super();
// Reset to the first page when the user changes the filter.
this._filterChange.subscribe(() => this._paginator.pageIndex = 0);
}
/** Connect function called by the table to retrieve one stream containing the data to render. */
connect(): Observable<Baza[]> {
// Listen for any changes in the base data, sorting, filtering, or pagination
const displayDataChanges = [
this._exampleDatabase.dataChange,
this._sort.sortChange,
this._filterChange,
this._paginator.page,
];
this._exampleDatabase.getAllItems();
return Observable.merge(...displayDataChanges).map(() => {
// Filter data
this.filteredData = this._exampleDatabase.data.slice().filter((item: Baza) => {
const searchStr = (item.ident + item.naziv + item.mt + item.lokacija + item.napomena).toLowerCase();
return searchStr.indexOf(this.filter.toLowerCase()) !== -1;
});
// Sort filtered data
const sortedData = this.sortData(this.filteredData.slice());
// Grab the page's slice of the filtered sorted data.
const startIndex = this._paginator.pageIndex * this._paginator.pageSize;
this.renderedData = sortedData.splice(startIndex, this._paginator.pageSize);
return this.renderedData;
});
}
disconnect() {
}
/** Returns a sorted copy of the database data. */
sortData(data: Baza[]): Baza[] {
... sort stuff
}
Dưới đây là DataService nơi tôi đoán tôi nên làm cập nhật lĩnh vực:
import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse, HttpHeaders} from '@angular/common/http';
import { Baza } from '../models/kanban.baza';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class DataService {
private readonly API_URL = 'http://localhost/api/'
/** Stream that emits whenever the data has been modified. */
dataChange: BehaviorSubject<Baza[]> = new BehaviorSubject<Baza[]>([]);
constructor(private httpClient: HttpClient) {
}
get data(): Baza[] {
return this.dataChange.value;
}
getAllItems(): void {
this.httpClient.get<Baza[]>(this.API_URL).subscribe(data => {
this.dataChange.next(data['items']);
});
}
addItem(baza: Baza): void {
this.httpClient.post(this.API_URL, Baza).subscribe(data => {
//THIS WAS MY BEST TRY BUT IT DOESN'T WORK :(
const copiedData = this.data.slice();
copiedData.push(baza);
console.log(copiedData);
this.dataChange.next(copiedData);
});
}
updateItem(baza: Baza): void {
this.httpClient.put(this.API_URL + baza.id, baza).subscribe();
}
deleteItem(id: number): void {
this.httpClient.delete(this.API_URL + id, {headers: new HttpHeaders().set('Access-Control-Allow-Origin', '*')}).subscribe();
}
}
CẬP NHẬT 2017/11/27:
Được rồi, cuối cùng tôi đã tìm ra cách để t rigger thêm hàng mới. Tôi đã phải gọi dataChange.value
bên trong thành phần bảng. Khi bạn tải nó với một số dòng dữ liệu mới sẽ xuất hiện tức thời.
const data = {id: 208, ident: 233, naziv: 'test', mt: 291, komada: 2, jm: 'a', orginal: 100, lokacija: 3, napomena: 'pls work'};
this.exampleDatabase.dataChange.value.push(data);
Cùng một điều trong DataService sẽ không làm việc:
this.dataChange.value.push(data);
Plunker là ở đây:
https://plnkr.co/edit/IWCVsBRl54F7ylGNIJJ3?p=info
EDIT 2017/11/28:
Bây giờ chỉ điều bên trái là xây dựng lo gic để thêm, chỉnh sửa và xóa. Để thêm vào dễ dàng, nó chỉ là `value.push (dữ liệu) '. Cảm ơn vì đã giúp mọi người.
Tuyệt vời. Chỉ cần đề cập đến, bạn có thể xác định bản dịch của croatian cho toàn bộ ứng dụng trong phần nhà cung cấp app.module.ts như sau: {cung cấp: MatPaginatorIntl, useClass: MatPaginatorIntlCro}. Nếu bạn quan tâm đến việc thực hiện MatPaginatorIntlCro của tôi, tôi có thể đăng nó. – zszep
Giới thiệu về bản dịch, chắc chắn :). Gần đây tôi đã tìm ra toàn bộ logic mới cho vấn đề cập nhật bảng fronted vì vậy tôi sẽ viết ứng dụng mẫu và đưa vào github. ;) – besthiroeu