কৌণিক + উপাদান - একটি ডেটা উত্স কীভাবে সতেজ করা যায় (মাদুর-টেবিল)


120

আমি ব্যবহারকারীদের বেছে নেওয়া ভাষার বিষয়বস্তু তালিকাবদ্ধ করতে একটি মাদুর-টেবিল ব্যবহার করছি । তারা ডায়লগ প্যানেল ব্যবহার করে নতুন ভাষা যুক্ত করতে পারে। তারা কোনও ভাষা যুক্ত করে ফিরে এসেছিল। আমি চাই আমার ডেটা সোর্স তারা যে পরিবর্তন করেছে তা দেখানোর জন্য রিফ্রেশ করুন।

আমি কোনও পরিষেবা থেকে ব্যবহারকারীর ডেটা পেয়ে এবং তাজা পদ্ধতিতে একটি ডেটাসোর্সে পাস করে ডেটাস্টোর শুরু করি initial

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);   
    });
  }
}

ভাষা-ডেটা-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
  }

}

তাই আমি একটি রিফ্রেশ পদ্ধতিতে কল করার চেষ্টা করেছি যেখানে আমি ব্যাকএন্ড থেকে আবার ব্যবহারকারীকে পাই এবং তারপরে আমি ডেটা উত্সটি পুনরায় নতুন করে লিখি। তবে এটি কাজ করে না, কোনও পরিবর্তন ঘটছে না।


1
আপনি "তথ্য উৎস থেকে" পরিবর্তন আরম্ভ করতে চান, অনুগ্রহ করে একটি এ চেহারা আছে stackoverflow.com/questions/47897694/...
Yennefer

ইভেন্ট প্রেরণকারীরা এই ক্ষেত্রে ব্যবহার করতে পারেন। stackoverflow.com/a/44858648/8300620
রোহিত পার্ট

উত্তর:


58

ট্রিগার ব্যবহার করে একটি পরিবর্তন সনাক্তকরণ ChangeDetectorRefমধ্যে refresh()পদ্ধতি মাত্র, নতুন ডেটা গ্রহণ উদ্বুদ্ধ পর ChangeDetectorRef কন্সট্রাকটর এবং ব্যবহারে detectChanges ভালো:

import { Component, OnInit, ChangeDetectorRef } 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,
              private changeDetectorRefs: ChangeDetectorRef) { }

  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);
      this.changeDetectorRefs.detectChanges();
    });
  }
}

9
কাজ করে মনে হচ্ছে, এটি কি এটি সঠিক উপায়? কিছুটা হ্যাকি মনে হচ্ছে ...
কে

অন্যান্য উপায় কি? আপনি একটি সম্পূর্ণ উত্তরের জন্য সমাধান মধ্যে উদাহরণ প্রদান করতে পারেন?
কে


88

ChangeDetectorRefপ্রশ্নটি তৈরি করার সময় প্রয়োজনীয়টি ছিল কিনা আমি জানি না , তবে এখন এটি যথেষ্ট:

import { MatTableDataSource } from '@angular/material/table';

// ...

dataSource = new MatTableDataSource<MyDataType>();

refresh() {
  this.myService.doSomething().subscribe((data: MyDataType[]) => {
    this.dataSource.data = data;
  }
}

উদাহরণ:
স্ট্যাকব্লিটজ


4
যদিও এই সমাধানটি বাস্তবে কাজ করে, ফলাফলের প্রথম পৃষ্ঠা ব্যতীত অন্য কোনও উপাদান যুক্ত করা হলে এটি উপাদান প্যাগিনেটরকে বিশৃঙ্খলা দেয়। আমি বুঝতে পারি যে এটি এই প্রশ্নের আওতার বাইরে নয় তবে যেহেতু দু'জনের সম্পর্ক রয়েছে, আপনি কি সেই সমস্যার একটি দ্রুত সমাধান পেয়েছেন যা আপনি নিজের উত্তরে যুক্ত করতে পারেন?
নাইট

5
@ রাত্রে আমি মনে করি MatTableDataSource.paginatorপ্যাগেইনেটরের দৃষ্টিভঙ্গি শুরু হওয়ার পরে আপনাকে সম্পত্তিটিতে প্যাগিনেটর নিয়োগ করতে হবে । paginatorএখানে সম্পত্তির বিবরণ দেখুন : উপাদান.
মার্টিন স্নাইডার

ভাল রেফারেন্স। আমি ডক্সে আগে এটি স্পষ্ট করেছিলাম না। ধন্যবাদ!
নাইট

2
@ এমএ-মাদদিন কীভাবে এটি করবেন তা সম্পর্কে আপনি আরও সুনির্দিষ্ট হতে পারেন? উদাহরণ?
নাথানফান

@ নাথানফান দেরীতে, তবে একটি উদাহরণ যুক্ত করেছেন;)
মার্টিন শ্নাইডার

46

সুতরাং আমার পক্ষে, আমি যে সমস্যার মুখোমুখি হয়েছি তার উত্তরটি @ কে-এর চেয়ে প্রায় একই রকম কেউই দেয়নি gave আমার জন্য এটি বাছাই সম্পর্কে, সারণি সারণি মাদুর পরিবর্তন হয় না। আমি এই উত্তরটির উদ্দেশ্য কারণ এটি গুগল অনুসন্ধান করে আমি খুঁজে পাই topic আমি কৌনিক 6 ব্যবহার করছি।

এখানে যেমন বলা হয়েছে :

যেহেতু টেবিলটি পারফরম্যান্সের জন্য অনুকূলিত হয়েছে, এটি স্বয়ংক্রিয়ভাবে ডেটা অ্যারেতে পরিবর্তনগুলি পরীক্ষা করবে না। পরিবর্তে, যখন বস্তুগুলি যুক্ত করা, অপসারণ করা বা ডেটা অ্যারেতে সরানো হয়, আপনি টেবিলের রেন্ডার করা সারিগুলিতে তার রেন্ডাররো () পদ্ধতিতে কল করে একটি আপডেট ট্রিগার করতে পারেন।

সুতরাং আপনার পরিবর্তনগুলি প্রদর্শিত হওয়ার জন্য আপনাকে কেবল আপনার রিফ্রেশ () পদ্ধতিতে রেন্ডারআর () কল করতে হবে।

একীকরণের জন্য এখানে দেখুন ।


1
যদি টেবিলের ডেটা উত্স ক্লায়েন্টের পরিবর্তিত হয় তবে এই উত্তরটি সম্ভবত আপনি যা খুঁজছেন তা। দুর্দান্ত কাজ!
অ্যালভিন সালদানহা

এটি কৌণিক উপাদান 8
টম

ধন্যবাদ. তবে কোন অবজেক্ট থেকে আমি "রেন্ডারস ()" কল করব? এটি কি এই 'ডেটা সোর্স' এ আছে?
সাক্ষী ট্রুথ

19

যেহেতু আপনি ব্যবহার করছেন MatPaginator, আপনাকে কেবল প্যাগিনেটরে কোনও পরিবর্তন করতে হবে, এটি ডেটা পুনরায় লোডকে ট্রিগার করে।

সাধারণ কৌশল:

this.paginator._changePageSize(this.paginator.pageSize); 

এটি পৃষ্ঠার _emitPageEvent()আকারটিকে বর্তমান পৃষ্ঠার আকারে আপডেট করে, তাই বেসরকারী ফাংশনটিকে খুব বেশি বলা হয়, টেবিলে পুনরায় লোড ট্রিগার করে কিছুই পরিবর্তিত হয় না।


আমি আপনার কোড চেষ্টা করেছিলাম এবং এটি কার্যকর হয় না (এর কোনও প্রভাব নেই)। তবে নেক্সটপেজ এবং তারপরে পূর্ববর্তী পেজ আবার কাজ করে তবে কোনও সমাধান হয় না।
আহমেদ হাসন

_changePageSize()জনসাধারণ ঠিক না? এটি ব্যবহার করার জন্য নিরাপদ? স্ট্যাকওভারফ্লো
জোন্স

9
this.dataSource = new MatTableDataSource<Element>(this.elements);

আপনার ক্রমের নীচে যুক্ত করে নির্দিষ্ট সারি যুক্ত বা মুছুন।

refresh() {
  this.authService.getAuthenticatedUser().subscribe((res) => {
    this.user = new MatTableDataSource<Element>(res);   
  });
}

এটি কী e উপাদানগুলি
parvat

8

এটি করার সর্বোত্তম উপায় হ'ল আপনার ডেটাসোর্স বাস্তবায়নে একটি অতিরিক্ত পর্যবেক্ষণযোগ্য যোগ করা।

সংযোগ পদ্ধতিতে আপনি ইতিমধ্যে Observable.mergeপর্যবেক্ষণযোগ্যদের এমন একটি অ্যারেতে সাবস্ক্রাইব করতে ব্যবহার করা উচিত যা এতে প্যাগিনেটর.পৃষ্ঠা, সারণি চেঞ্জ, ইত্যাদি অন্তর্ভুক্ত থাকে আপনি এটিতে একটি নতুন বিষয় যুক্ত করতে পারেন এবং যখন আপনাকে রিফ্রেশ করার দরকার হয় তখন এটির সাথে কল করতে পারেন।

এটার মতো কিছু:

export class LanguageDataSource extends DataSource<any> {

    recordChange$ = new Subject();

    constructor(private languages) {
      super();
    }

    connect(): Observable<any> {

      const changes = [
        this.recordChange$
      ];

      return Observable.merge(...changes)
        .switchMap(() => return Observable.of(this.languages));
    }

    disconnect() {
      // No-op
    }
}

এবং তারপরে আপনি recordChange$.next()একটি রিফ্রেশ শুরু করতে কল করতে পারেন ।

স্বাভাবিকভাবেই আমি কলটি একটি রিফ্রেশ () পদ্ধতিতে জড়িয়ে রাখতাম এবং ডেটোসোর্স দৃষ্টান্তের ডাব্লু / উপাদানটিতে এবং অন্যান্য সঠিক কৌশলগুলিতে কল করতাম।


এই পদ্ধতি সঠিক উপায় হতে পারে। এটি আমার পক্ষে ভাল কাজ করে
মানু

আমি যখন ম্যাটবেলডেটা সোর্স প্রসারিত করতে চাই তখন আমি কীভাবে এটি বাস্তবায়ন করব? আমি যখন আপনার কোড উদাহরণটি চেষ্টা করি তখন ত্রুটিটি পাই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>'.
মরিস

1
@ মরিস টাইপ ম্যাটবেলডেটা সোর্স একটি ভিন্ন রিটার্ন টাইপের সাথে সংযোগ পদ্ধতি প্রয়োগ করে। এটি আচরণবিধি <টি []> ব্যবহার করে যার অর্থ একটি পর্যবেক্ষনের পরিবর্তে এটি ফিরিয়ে দেওয়ার জন্য আপনাকে কেবল উদাহরণ পরিবর্তন করতে হবে। আপনার এখনও ডেটাসোর্স ব্যবহার করতে সক্ষম হওয়া উচিত তবে যদি আপনার ম্যাটবেলডেটা সোর্স ব্যবহার করতে হয় তবে আপনার পর্যবেক্ষণযোগ্যতে সাবস্ক্রাইব করা এমন আচরণগত সাবজেক্টটি ফিরিয়ে আনুন, ধরে নিবেন যে আপনার একটি শুরু হয়েছে ass আশা করি এইটি কাজ করবে. আপনি নতুন ডেটাসোর্সের
14

7

আপনি কেবল ডেটাসোর্স সংযোগ ফাংশন ব্যবহার করতে পারেন

this.datasource.connect().next(data);

তাই ভালো. 'ডেটা' ডেটাটেবলের জন্য নতুন মান


সম্ভাবনা থাকলেও কাজ করে বলে মনে হয় না। এর পরে যদি আপনি this.datasource.data অ্যাক্সেস করেন তবে এটি আপডেট হয় না।
রুই মার্কস

4

আপনি "কনক্যাট" ব্যবহার করে টেবিলের ডেটা সহজেই আপডেট করতে পারেন:

উদাহরণ স্বরূপ:

language.component.ts

teachDS: any[] = [];

language.component.html

<table mat-table [dataSource]="teachDS" class="list">

এবং, আপনি যখন ডেটা আপডেট করবেন (language.componal.ts):

addItem() {
    // newItem is the object added to the list using a form or other way
    this.teachDS = this.teachDS.concat([newItem]);
 }

যখন আপনি "কনক্যাট" কৌণিক ব্যবহার করছেন তখন অবজেক্টের পরিবর্তনগুলি (এটি.টিচডিডিএস) সনাক্ত করুন এবং আপনাকে অন্য কোনও জিনিস ব্যবহার করার দরকার নেই।

পিডি: এটি আমার পক্ষে কৌণিক 6 এবং 7 এ কাজ করছে, আমি অন্য সংস্করণ চেষ্টা করিনি।


2
হ্যাঁ, এটি আমার পক্ষে কাজ করে, রেফারেন্স এবং মান বৈচিত্র সম্পর্কে সমস্যা, পরিবর্তন সনাক্তকরণ নতুন পরিবর্তন দেখতে পাবে না, তার জন্য আপনার এটি আপডেট করা দরকার।
মায়রা রদ্রিগেজ

ডেটাসোর্সটি কেবলমাত্র একটি অ্যারে হয় তবে ডেটাসোর্স যখন ম্যাটবেলডেটা উত্স অবজেক্ট হয় তখন এটি কাজ করতে পারে।
রুই মার্কস

3

আপনি রেন্ডারও () পদ্ধতিটিও ব্যবহার করতে পারেন।

@ ভিউচিল্ড (ম্যাটবেল, {স্ট্যাটিক: মিথ্যা}) টেবিল: ম্যাটবেল // ইনিশিয়ালাইজ করুন

তারপরে this.table.renderRows ();

রেফারেন্সের জন্য এটি পরীক্ষা করে দেখুন -: https://www.freakyjolly.com/angular-7-8-edit-add-delete-rows-in-matory-table-with-used-dialogs-inline-row-operation/


3

ঠিক আছে, আমি একই ধরণের সমস্যায় পড়েছি যেখানে আমি ডেটা উত্সটিতে কিছু সংযোজন করেছি এবং এটি পুনরায় লোড হচ্ছে না।

সবচেয়ে সহজ উপায় আমি সহজেই ডেটা পুনরায় সাইন ইন করার জন্য খুঁজে পেয়েছি

let dataSource = ['a','b','c']
dataSource.push('d')
let cloned = dataSource.slice()
// OR IN ES6 // let cloned = [...dataSource]
dataSource = cloned

পারফেক্ট !! এটা wokrs !! ধন্যবাদ :)
নিকোলাস

3

কৌনিক 9 এ, গোপন কথাটি this.dataSource.data = this.dataSource.data;

উদাহরণ:

import { MatTableDataSource } from '@angular/material/table';

dataSource: MatTableDataSource<MyObject>;

refresh(): void {
    this.applySomeModif();
    // Do what you want with dataSource

    this.dataSource.data = this.dataSource.data;
}

applySomeModif(): void {
    // add some data
    this.dataSource.data.push(new MyObject());
    // delete index number 4
    this.dataSource.data.splice(4, 0);
}

2

আমি দুটি সংস্থান ব্যবহার করে একটি ভাল সমাধান অর্জন করেছি:

ডেটা সোর্স এবং প্যাগেইনেটর উভয়কেই রিফ্রেশ করছে:

this.dataSource.data = this.users;
this.dataSource.connect().next(this.users);
this.paginator._changePageSize(this.paginator.pageSize);

উদাহরণস্বরূপ যেখানে ডেটাসোর্স এখানে সংজ্ঞায়িত করা হয়:

    users: User[];
    ...
    dataSource = new MatTableDataSource(this.users);
    ...
    this.dataSource.paginator = this.paginator;
    ...

1
import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';

export class LanguageComponent implemnts OnInit {
  displayedColumns = ['name', 'native', 'code', 'leavel'];
  user: any;
  private update = new Subject<void>();
  update$ = this.update.asObservable();

  constructor(private authService: AuthService, private dialog: MatDialog) {}

   ngOnInit() {
     this.update$.subscribe(() => { this.refresh()});
   }

   setUpdate() {
     this.update.next();
   }

   add() {
     this.dialog.open(LanguageAddComponent, {
     data: { user: this.user },
   }).afterClosed().subscribe(result => {
     this.setUpdate();
   });
 }

 refresh() {
   this.authService.getAuthenticatedUser().subscribe((res) => {
     this.user = res;
     this.teachDS = new LanguageDataSource(this.user.profile.languages.teach);   
    });
  }
}

8
দয়া করে আপনার উত্তরে একটি ব্যাখ্যা যুক্ত করুন, কেবল পোস্টিং কোড খুব সহায়ক নয় এবং এর ফলে আপনার উত্তর সরানো হতে পারে।
টিজে ওলছন

1

আমার ক্ষেত্রে (কৌণিক 6+), MatTableDataSourceতৈরি থেকে আমি উত্তরাধিকার সূত্রে পেয়েছি MyDataSource। পরে ফোন না করেইthis.data = someArray

this.entitiesSubject.next(this.data as T[])

যেখানে প্রদর্শিত হয় না তথ্য

ক্লাস মাইডাটাসোর্স

export class MyDataSource<T extends WhateverYouWant> extends MatTableDataSource<T> {

    private entitiesSubject = new BehaviorSubject<T[]>([]);


    loadDataSourceData(someArray: T[]){
        this.data = someArray //whenever it comes from an API asyncronously or not
        this.entitiesSubject.next(this.data as T[])// Otherwise data not displayed
    }

    public connect(): BehaviorSubject<T[]> {
        return this.entitiesSubject
    }

}//end Class 

1

এটি করার দুটি উপায় আছে কারণ কৌণিক পদার্থটি অসঙ্গত এবং এটি খুব খারাপভাবে নথিভুক্ত। কৌণিক উপাদান টেবিল আপডেট হবে না যখন একটি নতুন সারি আসবে। আশ্চর্যজনকভাবে এটি বলা হয় কারণ এটি পারফরম্যান্সের সমস্যা। তবে এটি দেখতে আরও একটি বাই ডিজাইন ইস্যুর মতো, তারা পরিবর্তন করতে পারে না। নতুন সারি দেখা দিলে টেবিলটির আপডেট হওয়া আশা করা উচিত। যদি এই আচরণটি ডিফল্টরূপে সক্ষম না করা হয় তবে এটিটি বন্ধ করার জন্য একটি সুইচ থাকা উচিত।

যাইহোক, আমরা কৌণিক উপাদান পরিবর্তন করতে পারি না। তবে আমরা এটি করার জন্য খুব খারাপভাবে নথিভুক্ত পদ্ধতিটি ব্যবহার করতে পারি:

একটি - যদি আপনি সরাসরি উত্স হিসাবে অ্যারে ব্যবহার করেন:

call table.renderRows()

যেখানে টেবিলটি মাদুর-সারণির ভিউচিল্ড

দ্বিতীয় - আপনি যদি বাছাই এবং অন্যান্য বৈশিষ্ট্যগুলি ব্যবহার করেন

table.renderRows () আশ্চর্যজনকভাবে কাজ করবে না। কারণ মাদুর-টেবিলটি এখানে অসঙ্গতিপূর্ণ। উত্স পরিবর্তিত হয়েছে তা বলার জন্য আপনাকে একটি হ্যাক ব্যবহার করতে হবে। আপনি এই পদ্ধতিতে এটি করুন:

this.dataSource.data = yourDataSource;

যেখানে ডেটাসোর্সটি বাছাই এবং অন্যান্য বৈশিষ্ট্যগুলির জন্য ম্যাটবেলডেটা সোর্স র‍্যাপার হয়।



0

আমি মনে করি যে MatTableDataSourceঅবজেক্টটি কোনওভাবে ডেটা অ্যারের সাথে সংযুক্ত যা আপনি MatTableDataSourceকনস্ট্রাক্টরের কাছে পাস করেন ।

এই ক্ষেত্রে:

dataTable: string[];
tableDS: MatTableDataSource<string>;

ngOnInit(){
   // here your pass dataTable to the dataSource
   this.tableDS = new MatTableDataSource(this.dataTable); 
}

সুতরাং, যখন আপনাকে ডেটা পরিবর্তন করতে হবে; মূল তালিকায় পরিবর্তন করুন dataTableএবং তারপরে কল _updateChangeSubscription()পদ্ধতিতে টেবিলে পরিবর্তনটি প্রতিবিম্বিত করুন tableDS

এই ক্ষেত্রে:

this.dataTable.push('testing');
this.tableDS._updateChangeSubscription();

এটি আমার সাথে অ্যাঙ্গুলার 6 এর মাধ্যমে কাজ করছে।


4
এই পদ্ধতিটি একটি আন্ডারস্কোর দিয়ে উপসর্গযুক্ত _এবং আপনি এটি কল করেন?
স্টিফেন

0

এটি আমার পক্ষে কাজ করছে:

dataSource = new MatTableDataSource<Dict>([]);
    public search() {
        let url = `${Constants.API.COMMON}/dicts?page=${this.page.number}&` + 
        (this.name == '' ? '' : `name_like=${this.name}`);
    this._http.get<Dict>(url).subscribe((data)=> {
    // this.dataSource = data['_embedded'].dicts;
    this.dataSource.data =  data['_embedded'].dicts;
    this.page = data['page'];
    this.resetSelection();
  });
}

সুতরাং আপনার হিসাবে আপনার ডেটাসোর্স উদাহরণটি ঘোষণা করা উচিত MatTableDataSource


0

আমি আরও কিছু গবেষণা করেছি এবং আমার যা প্রয়োজন তা দেওয়ার জন্য এই জায়গাটি পেয়েছি - পরিষ্কার মনে হয় এবং সার্ভার থেকে সতেজ হওয়াতে ডেটা আপডেটের সাথে সম্পর্কিত: https://blog.angular-university.io/angular-matory-data-table/

উপরের পৃষ্ঠায় সর্বাধিক ক্রেডিট। নীচে নির্বাচনের পরিবর্তনে কোনও ডেটাসোর্সে আবদ্ধ একটি মাদুর-টেবিল আপডেট করতে কীভাবে মাদুর-নির্বাচক ব্যবহার করা যেতে পারে তার একটি নমুনা দেওয়া হল। আমি কৌনিক 7.. ব্যবহার করছি, প্রশস্ত হওয়ার জন্য দুঃখিত, সম্পূর্ণ হওয়ার চেষ্টা করছি তবে সংক্ষিপ্ত - আমি যতগুলি সম্ভব অপ্রয়োজনীয় অংশগুলি ছিটিয়েছি। এর সাহায্যে আরও কাউকে দ্রুত এগিয়ে যাওয়ার সহায়তায়!

organization.model.ts:

export class Organization {
    id: number;
    name: String;
}

organization.service.ts:

import { Observable, empty } from 'rxjs';
import { of } from 'rxjs';

import { Organization } from './organization.model';

export class OrganizationService {
  getConstantOrganizations(filter: String): Observable<Organization[]> {
    if (filter === "All") {
      let Organizations: Organization[] = [
        { id: 1234, name: 'Some data' }
      ];
      return of(Organizations);
     } else {
       let Organizations: Organization[] = [
         { id: 5678, name: 'Some other data' }
       ];
     return of(Organizations);
  }

  // ...just a sample, other filterings would go here - and of course data instead fetched from server.
}

organizationdatasource.model.ts:

import { CollectionViewer, DataSource } from '@angular/cdk/collections';
import { Observable, BehaviorSubject, of } from 'rxjs';
import { catchError, finalize } from "rxjs/operators";

import { OrganizationService } from './organization.service';
import { Organization } from './organization.model';

export class OrganizationDataSource extends DataSource<Organization> {
  private organizationsSubject = new BehaviorSubject<Organization[]>([]);

  private loadingSubject = new BehaviorSubject<boolean>(false);

  public loading$ = this.loadingSubject.asObservable();

  constructor(private organizationService: OrganizationService, ) {
    super();
  }

  loadOrganizations(filter: String) {
    this.loadingSubject.next(true);

    return this.organizationService.getOrganizations(filter).pipe(
      catchError(() => of([])),
      finalize(() => this.loadingSubject.next(false))
    ).subscribe(organization => this.organizationsSubject.next(organization));
  }

  connect(collectionViewer: CollectionViewer): Observable<Organization[]> {
    return this.organizationsSubject.asObservable();
  }

  disconnect(collectionViewer: CollectionViewer): void {
    this.organizationsSubject.complete();
    this.loadingSubject.complete();
  }
}

organizations.component.html:

<div class="spinner-container" *ngIf="organizationDataSource.loading$ | async">
    <mat-spinner></mat-spinner>
</div>

<div>
  <form [formGroup]="formGroup">
    <mat-form-field fxAuto>
      <div fxLayout="row">
        <mat-select formControlName="organizationSelectionControl" (selectionChange)="updateOrganizationSelection()">
          <mat-option *ngFor="let organizationSelectionAlternative of organizationSelectionAlternatives"
            [value]="organizationSelectionAlternative">
            {{organizationSelectionAlternative.name}}
          </mat-option>
        </mat-select>
      </div>
    </mat-form-field>
  </form>
</div>

<mat-table fxLayout="column" [dataSource]="organizationDataSource">
  <ng-container matColumnDef="name">
    <mat-header-cell *matHeaderCellDef>Name</mat-header-cell>
    <mat-cell *matCellDef="let organization">{{organization.name}}</mat-cell>
  </ng-container>

  <ng-container matColumnDef="number">
    <mat-header-cell *matHeaderCellDef>Number</mat-header-cell>
    <mat-cell *matCellDef="let organization">{{organization.number}}</mat-cell>
  </ng-container>

  <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
  <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
</mat-table>

organizations.component.scss:

.spinner-container {
    height: 360px;
    width: 390px;
    position: fixed;
}

organization.component.ts:

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder } from '@angular/forms';
import { Observable } from 'rxjs';

import { OrganizationService } from './organization.service';
import { Organization } from './organization.model';
import { OrganizationDataSource } from './organizationdatasource.model';

@Component({
  selector: 'organizations',
  templateUrl: './organizations.component.html',
  styleUrls: ['./organizations.component.scss']
})
export class OrganizationsComponent implements OnInit {
  public displayedColumns: string[];
  public organizationDataSource: OrganizationDataSource;
  public formGroup: FormGroup;

  public organizationSelectionAlternatives = [{
    id: 1,
    name: 'All'
  }, {
    id: 2,
    name: 'With organization update requests'
  }, {
    id: 3,
    name: 'With contact update requests'
  }, {
    id: 4,
    name: 'With order requests'
  }]

  constructor(
    private formBuilder: FormBuilder,
    private organizationService: OrganizationService) { }

  ngOnInit() {
    this.formGroup = this.formBuilder.group({
      'organizationSelectionControl': []
    })

    const toSelect = this.organizationSelectionAlternatives.find(c => c.id == 1);
    this.formGroup.get('organizationSelectionControl').setValue(toSelect);

    this.organizationDataSource = new OrganizationDataSource(this.organizationService);
    this.displayedColumns = ['name', 'number' ];
    this.updateOrganizationSelection();
  }

  updateOrganizationSelection() {
    this.organizationDataSource.loadOrganizations(this.formGroup.get('organizationSelectionControl').value.name);
  }
}

0

পদার্থ সারণী পড়ার পরে পোস্ট ডেটা আপডেট না করে # 11638 ত্রুটি প্রতিবেদনটি আমি খুঁজে পেলাম সেরা (পড়ুন, সবচেয়ে সহজ সমাধান) হিসাবে একটি ইভেন্টএমিটার ব্যবহার করার পরামর্শ দিয়ে চূড়ান্ত মন্তব্যকারী 'shdharmen' দ্বারা প্রস্তাবিত হয়েছিল।

এতে উত্পন্ন ডেটাসোর্স শ্রেণিতে কয়েকটি সাধারণ পরিবর্তন জড়িত

ie) আপনার ডেটাসোর্স ক্লাসে একটি নতুন ব্যক্তিগত ভেরিয়েবল যুক্ত করুন

import { EventEmitter } from '@angular/core';
...
private tableDataUpdated = new EventEmitter<any>();

এবং যেখানে আমি অভ্যন্তরীণ অ্যারেতে (এই.ডাটা) নতুন ডেটা ঠেলেছি, আমি একটি ইভেন্টের উদ্রেক করি।

public addRow(row:myRowInterface) {
    this.data.push(row);
    this.tableDataUpdated.emit();
}

এবং অবশেষে, 'সংযুক্ত' পদ্ধতিতে 'ডেটা মিউটেশন' অ্যারে পরিবর্তন করুন - নীচে

const dataMutations = [
    this.tableDataUpdated,
    this.paginator.page,
    this.sort.sortChange
];

0

// এটি এই ডেটাসোর্সটি
হ'ল এই অতিথিদের = [];

this.gists.push ({আইডি: 1, নাম: 'রিকার্ডো'});

// ডেটা রিফ্রেশ


0
npm install @matheo/datasource

ভবিষ্যতে অফিশিয়াল ম্যাটারিয়াল ডেটাসোর্স হিসাবে লক্ষ্যযুক্ত একটি লাইব্রেরি প্রকাশ করেছি, যে কোনও ধরণের ইনপুট স্ট্রিমকে সমর্থন করে (সাজান, পৃষ্ঠায়িতকরণ, ফিল্টারগুলি) এবং আপনি কোডিংয়ের সময় এটি কীভাবে কাজ করে তা দেখতে ডিবাগিং সহ কিছু কনফিগারেশন।

import { MatDataSourceModule } from '@matheo/datasource';

আপনি স্ট্যাকব্লিটজ ডেমো এবং আরও তথ্য এখানে পেতে পারেন:
https://medium.com/@matheo/reactive-datasource-for-angular-1d869b0155f6

আমি আপনার মতামত শুনে খুশি হব এবং প্রয়োজনে আপনার ব্যবহারের ক্ষেত্রে সমর্থন করব।
শুভ কোডিং!


0

আমি চেঞ্জডেক্টরআরফ, সাবজেক্ট এবং বিহ্যাভিউর সাবজেক্ট চেষ্টা করেছিলাম তবে আমার জন্য কী কাজ করে

dataSource = [];
this.dataSource = [];
 setTimeout(() =>{
     this.dataSource = this.tableData[data];
 },200)

এখানে কি হচ্ছে? পরিবর্তনশীল নামকরণের ভুল হয়েছে বলে আমার মনে হয় feel
চুমিয়াস্টবকেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.