Angular v2.4.8およびPrimeNg v1.1.4を使用する
2つのコンポーネントがあるページがあります。
一度に5つのファイルを送信するようにDropzoneを構成し、5つのファイルで終了すると、イベントonDropZoneSendingMultiple
が発生します。すべてのファイルがアップロードされると、onDropZoneQueueComplete
が発生します。
両方のリスナーで、2番目のコンポーネントにあるデータテーブルを更新します。これは機能していません。新しいファイルを表示するには、ページを更新する必要があります。
メインページの私のHTML:
_<div class="row" id="dropzoneContainer">
<dropzone class="dropzone" #dz [config]="dropZoneConfig"
(error)="onDropZoneUploadError($event)"
(sendingmultiple)="onDropZoneSendingMultiple($event)"
(queuecomplete)="onDropZoneQueueComplete($event, dz);"
(maxfilesreached)="onDropZoneMaxfilesReached($event)"
(maxfilesexceeded)="onDropZoneMaxfilesExceeded"></dropzone>
</div>
<div class="row">
<div class="col-md-12">
<FilesList></FilesList>
</div>
</div>
_
Dropzone
-コンポーネントはドロップゾーンを示します。 FilesList
はデータテーブルを示します。 HTMLの一部:
_<p-dataTable [hidden]="loading" [value]="files" selectionMode="single" (onRowSelect)="details($event)">
_
私のメインのTSファイルには次のものがあります:
_@ViewChild(FilesListComponent)
public filesListComponent: FilesListComponent;
private reloadFileList() {
this.filesListComponent.reload();
}
_
私のファイルリストtsには
_public files: File[];
public reload() {
this.getFiles();
}
public getFiles() {
this.fileService.getAll()
.then(
data => {
this.files = data;
});
}
_
getFiles
は、ページのロード時にも呼び出されます。 console.log()
ステートメントを追加すると、getFiles()
が呼び出され、_this.files
_が更新されますが、テーブルは更新されません。
プライミングテーブルにバインドされた配列にレコードを追加する新しい構文をまだ探している人向け
this.arrayRecords= [...this.arrayRecords, newObject];
Update:PrimeNGは、変更を自動的に検出していたDoCheckインターフェイスを最近削除しました。次を参照してください: https://www.primefaces.org/primeng- 4-0-0-rc4-released /
答えは、スプレッド演算子([... arr]- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator )を使用して.Push()の代わりに配列にアイテムを追加します。
元の回答:似たような問題があり、少し異なるアプローチを使用して解決しました。同じサービスを使用してファイルをアップロードおよび取得する場合は、コンポーネント間でイベントをリッスンする代わりにRxJSを使用できます。
私のサービスでは、POSTまたはPUTを使用するときにアプリ全体にリロードしたい:
private _shouldUpdateSource = new BehaviorSubject<boolean>(false);
shouldUpdateObservable = this._shouldUpdateSource.asObservable();
POSTおよび/またはPUTメソッド
this.http.post(..).map( res => {this._shouldUpdateSource.next(true);});
これにより、コンポーネントのfileService.shouldUpdateObservableをサブスクライブできます。
this.shouldUpdateSub = this.fileService.shouldUpdateObservable
.subscribe((shouldUpdate: boolean) => {
if (shouldUpdate) {
this.updateFiles();
}
});
これは、私が見た/使用したコンポーネント間のサービスに関する通信を処理する最良の方法のようです。
-編集-公式ドキュメントの同じ概念を次に示します。
https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
-編集2-4.0.0に更新した後、この問題に再び遭遇しました。 FWIW、私はPrimeNG Datatableを削除することになり、代わりに手動の* ngForを使用しましたが、うまくいきました。 PrimeNgのドキュメント( https://www.primefaces.org/primeng/#/datatable )は次のように指示しているようです:
「たとえば、アイテムを削除するときにスプライスの代わりにスライスを使用するか、アイテムを追加するときにプッシュメソッドの代わりにスプレッド演算子を使用します。」
公式のAngularドキュメンテーションがあなたにそうするように言っていることに反するので、彼らがあなたにこれをするように頼む理由はわかりませんが、[value]バインディングの理由と関係があると思います期待どおりに動作しません。
個人的には、明示的なrefresh()関数を持つCovalentデータテーブルを優先して、PrimeNgから離れています: https://teradata.github.io/covalent/#/components/data-table
[〜#〜] update [〜#〜]:p-dataTableの ドキュメント をよく見てみました。特に、変更検出というタイトルのセクション。 _[immutable]=false
_タグの_p-dataTable
_属性の回避策を削除し、代わりに、基になる配列を変更したときに次のようなものを返すことでテーブルを更新できるようにしました。
return myOriginalArray.slice();
[〜#〜] original [〜#〜]:アイテムを削除したときに_p-datatable
_を更新/更新するのに問題がありましたテーブルの設定に使用される基本配列から。理由はわかりませんが、次の属性を_p-datatable
_タグに追加すると問題が解決しました。
_[immutable]=false
_
PrimeNG ^ 4.1.3を使用しています
これは、子コンポーネントが変更を処理する方法に関係していると思われます。 onChangeイベントを実装し、そのようにファイルを設定する必要があります。以下に例を示します。
`` `
export class FilesListComponent implements OnChanges {
@Input() files: File[];
ngOnInit() {
}
// Subscribe to the change event and update the model
ngOnChanges(changes: {[propName: string]: SimpleChange}) {
let key = 'files';
this.files = changes[key].currentValue;
}
}
`` `
ビューをチェック用にマークし、detechchangeを呼び出します。
@ViewChild('searchDt') searchTable: DataTable;
self.dealService.getAccounts(self.searchParams).subscribe((response) => {
Deal.setAvailableAccount(response.map((current) => {
return {
"cifNumber": current['cif'],
"ucic": current['ucic'],
"accountNomenclature": current['customerName'],
}
}));
**self.searchTable.changeDetector.markForCheck();
self.searchTable.changeDetector.detectChanges();**
});