মাদুর-টেবিল বাছাই ডেমো কাজ করছে না


114

আমি mat-tableস্থানীয়ভাবে বাছাইয়ের জন্য স্থানীয়ভাবে চেষ্টা করার চেষ্টা করছি , এবং প্রত্যাশা অনুযায়ী ডেটা পেতে পারার সময়, শিরোনামের সারিটিতে ক্লিক করা বাছাই করা যেমন অনলাইন উদাহরণগুলিতে হয় তেমন করে না (কিছুই হয় না)। আমি এই ডেমোটি স্থানীয়ভাবে কাজ করার চেষ্টা করছি: https://matory.angular.io/components/sort/overview https://plnkr.co/edit/XF5VxOSEBxMTd9Yb3ZLA?p= পূর্বরূপ দেখুন

আমি কৌনিক সিএলআই সহ একটি নতুন প্রকল্প তৈরি করেছি, তারপরে এই পদক্ষেপগুলি অনুসরণ করেছি: https://matory.angular.io/guide/getting-st সূত্র

আমার স্থানীয় ফাইলগুলি এখানে:

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { MatSort, MatTableModule } from '@angular/material';

import { AppComponent } from './app.component';
import { TableSortingExample } from './table-sorting-example';

@NgModule({
  declarations: [
    AppComponent,
    TableSortingExample,
    MatSort
  ],
  imports: [
    BrowserModule,
    MatTableModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

app.componal.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
}

app.componal.html

<div style="text-align:center">
  <h1>
    Welcome to {{title}}!
  </h1>
  <table-sorting-example></table-sorting-example>
</div>

টেবিল-বাছাই-উদাহরণ html

<div class="example-container mat-elevation-z8">
  <mat-table #table [dataSource]="dataSource" matSort>

    <!--- Note that these columns can be defined in any order.
          The actual rendered columns are set as a property on the row definition" -->

    <!-- ID Column -->
    <ng-container matColumnDef="userId">
      <mat-header-cell *matHeaderCellDef mat-sort-header> ID </mat-header-cell>
      <mat-cell *matCellDef="let row"> {{row.id}} </mat-cell>
    </ng-container>

    <!-- Progress Column -->
    <ng-container matColumnDef="progress">
      <mat-header-cell *matHeaderCellDef mat-sort-header> Progress </mat-header-cell>
      <mat-cell *matCellDef="let row"> {{row.progress}}% </mat-cell>
    </ng-container>

    <!-- Name Column -->
    <ng-container matColumnDef="userName">
      <mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell>
      <mat-cell *matCellDef="let row"> {{row.name}} </mat-cell>
    </ng-container>

    <!-- Color Column -->
    <ng-container matColumnDef="color">
      <mat-header-cell *matHeaderCellDef mat-sort-header> Color </mat-header-cell>
      <mat-cell *matCellDef="let row" [style.color]="row.color"> {{row.color}} </mat-cell>
    </ng-container>

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


<!-- Copyright 2017 Google Inc. All Rights Reserved.
    Use of this source code is governed by an MIT-style license that
    can be found in the LICENSE file at http://angular.io/license -->

টেবিল-বাছাই-উদাহরণ.ts

import {Component, ViewChild} from '@angular/core';
import {DataSource} from '@angular/cdk/collections';
import {MatSort} from '@angular/material';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/startWith';
import 'rxjs/add/observable/merge';
import 'rxjs/add/operator/map';

/**
 * @title Table with sorting
 */
@Component({
  selector: 'table-sorting-example',
  styleUrls: ['table-sorting-example.css'],
  templateUrl: 'table-sorting-example.html',
})
export class TableSortingExample {
  displayedColumns = ['userId', 'userName', 'progress', 'color'];
  exampleDatabase = new ExampleDatabase();
  dataSource: ExampleDataSource | null;

  @ViewChild(MatSort) sort: MatSort;

  ngOnInit() {
    this.dataSource = new ExampleDataSource(this.exampleDatabase, this.sort);
  }
}

/** Constants used to fill up our data base. */
const COLORS = ['maroon', 'red', 'orange', 'yellow', 'olive', 'green', 'purple',
  'fuchsia', 'lime', 'teal', 'aqua', 'blue', 'navy', 'black', 'gray'];
const NAMES = ['Maia', 'Asher', 'Olivia', 'Atticus', 'Amelia', 'Jack',
  'Charlotte', 'Theodore', 'Isla', 'Oliver', 'Isabella', 'Jasper',
  'Cora', 'Levi', 'Violet', 'Arthur', 'Mia', 'Thomas', 'Elizabeth'];

export interface UserData {
  id: string;
  name: string;
  progress: string;
  color: string;
}

/** An example database that the data source uses to retrieve data for the table. */
export class ExampleDatabase {
  /** Stream that emits whenever the data has been modified. */
  dataChange: BehaviorSubject<UserData[]> = new BehaviorSubject<UserData[]>([]);
  get data(): UserData[] { return this.dataChange.value; }

  constructor() {
    // Fill up the database with 100 users.
    for (let i = 0; i < 100; i++) { this.addUser(); }
  }

  /** Adds a new user to the database. */
  addUser() {
    const copiedData = this.data.slice();
    copiedData.push(this.createNewUser());
    this.dataChange.next(copiedData);
  }

  /** Builds and returns a new User. */
  private createNewUser() {
    const name =
      NAMES[Math.round(Math.random() * (NAMES.length - 1))] + ' ' +
      NAMES[Math.round(Math.random() * (NAMES.length - 1))].charAt(0) + '.';

    return {
      id: (this.data.length + 1).toString(),
      name: name,
      progress: Math.round(Math.random() * 100).toString(),
      color: COLORS[Math.round(Math.random() * (COLORS.length - 1))]
    };
  }
}

/**
 * Data source to provide what data should be rendered in the table. Note that the data source
 * can retrieve its data in any way. In this case, the data source is provided a reference
 * to a common data base, ExampleDatabase. It is not the data source's responsibility to manage
 * the underlying data. Instead, it only needs to take the data and send the table exactly what
 * should be rendered.
 */
export class ExampleDataSource extends DataSource<any> {
  constructor(private _exampleDatabase: ExampleDatabase, private _sort: MatSort) {
    super();
  }

  /** Connect function called by the table to retrieve one stream containing the data to render. */
  connect(): Observable<UserData[]> {
    const displayDataChanges = [
      this._exampleDatabase.dataChange,
      this._sort.sortChange,
    ];

    return Observable.merge(...displayDataChanges).map(() => {
      return this.getSortedData();
    });
  }

  disconnect() {}

  /** Returns a sorted copy of the database data. */
  getSortedData(): UserData[] {
    const data = this._exampleDatabase.data.slice();
    if (!this._sort.active || this._sort.direction == '') { return data; }

    return data.sort((a, b) => {
      let propertyA: number|string = '';
      let propertyB: number|string = '';

      switch (this._sort.active) {
        case 'userId': [propertyA, propertyB] = [a.id, b.id]; break;
        case 'userName': [propertyA, propertyB] = [a.name, b.name]; break;
        case 'progress': [propertyA, propertyB] = [a.progress, b.progress]; break;
        case 'color': [propertyA, propertyB] = [a.color, b.color]; break;
      }

      let valueA = isNaN(+propertyA) ? propertyA : +propertyA;
      let valueB = isNaN(+propertyB) ? propertyB : +propertyB;

      return (valueA < valueB ? -1 : 1) * (this._sort.direction == 'asc' ? 1 : -1);
    });
  }
}


/**  Copyright 2017 Google Inc. All Rights Reserved.
 Use of this source code is governed by an MIT-style license that
 can be found in the LICENSE file at http://angular.io/license */

এটি অনলাইন টেবিলের মতো দেখায় তবে বাছাই কার্যকারিতাটির অভাব আছে কি কারও ধারণা আছে?


আমি প্রথমে অ্যাপটি ডিবাগ করব। কোন ত্রুটি? চালান ng test --sm=falseএবং দেখুন কি এসেছে।
কে.ভিংসেন্ট

এটি আমার কাছে @ ভিউচিল্ড (ম্যাটসোর্ট) বাছাই ছাড়াই কাজ করছে: ম্যাটসোর্ট; যে কোন কারন ?
ব্যবহারকারী 123456

উত্তর:


209

অন্য কারও জন্য যাদের এই সমস্যা থাকতে পারে: সমস্যাটি ছিল আমি কৌণিক উপকরণ ওয়েবসাইটে সঠিকভাবে এপিআই রেফারেন্সটি পড়িনি, যে অংশটি বলেছিল যে আমাকে ম্যাটসোর্টমডুল আমদানি করতে হয়েছে। আমি আমার আমদানির তালিকা পরিবর্তন app.module.ts করতে

imports: [
    BrowserModule,
    MatTableModule,
    MatSortModule
  ],

এটা ভাল কাজ করে


47
ডকুমেন্টেশনে এই মডিউলটির কোনও উল্লেখ নেই। উপাদান
সোনিক সোল

9
এটি ঠিক আছে, শিরোনামে পাঠ্য ক্লিকযোগ্য এবং আইকনটিও রয়েছে তবে এখনও বাছাইয়ের কাজ হচ্ছে না।
এসপিএনএল

4
চেক যদি BrowserAnimationsModuleএছাড়াও app.module.ts মধ্যে আমদানি করা হয়
Augustas

4
আমি কি বলতে পারি তারা এসওবি? আমার ভিউচিল্ড কেন কাজ করছে না তা জানার চেষ্টা করে আমি 1 ঘন্টা ব্যয় করেছি। তারা কি ম্যাটবেলমডুল থেকে এই ম্যাটসোর্টমোডুল আমদানি / রফতানি করতে পারে না ??
সাম্পগুন

7
আমি MatSortModuleএবং আমদানি করেছি BrowserAnimationsModuleএবং আমি নিশ্চিত করেছি যে ম্যাটকলামডিফ মানটি সম্পত্তির নামের সাথে মেলে, তবুও আমি এখনও এটি কিছুই করতে পারিনি।
ট্রেভর

147

আমার একটি সমস্যা ছিল যে বাছাই ফাংশনটি কাজ করছে তবে এটি সঠিকভাবে বাছাই হচ্ছে না। আমি বুঝতে পেরেছিলাম যে matColumnDefআমার class / interfaceযে সম্পত্তিতে আমি উল্লেখ করছি তার একই নাম থাকতে হবে matCellDef

কৌণিক পদার্থের ডকুমেন্টেশন অনুসারে :

ডিফল্টরূপে, MatTableDataSource এই ধারণাটি অনুসারে বাছাই করে যে সাজানো কলামের নামটি কলামটি প্রদর্শিত তথ্যের নামের সাথে মেলে।

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

<ng-container matColumnDef="name"> 
    <mat-header-cell *matHeaderCellDef mat-sort-header> NAME </mat-header-cell>
    <mat-cell *matCellDef="let row"> {{row.name}} </mat-cell>
</ng-container>

nameমধ্যে matColumnDefডিরেক্টিভের হিসাবে একই হতে হয়েছে nameএ ব্যবহৃত <mat-cell>অংশটি।


4
আপনার উদাহরণের মধ্যে আপনি কী উল্লেখ করছেন? তুলনা করার জন্য এটি আপনার ইন্টারফেসটিও দেখতে সহায়ক হবে।
ইশারউড

4
আমি কলামের নাম হিসাবে "আইডি" ব্যবহার করছিলাম যেখানে সত্তার "আইডি" ছিল। কেস পার্থক্যটি এটি চালাচ্ছে না (একটি রিফ্যাক্টরিং মিসের কারণে) .. এখন এটি সমাধান হয়েছে। ধন্যবাদ
নিতিনসিংহ

4
আপনাকে ধন্যবাদ, এটি খুব দরকারী।
বোহাও এলআই

4
@ নিতিনসিংহ, আপনি যদি elementএই `{{row.getName ()}}`
কোডেন্টারি

4
আমি আপনাকে একটি বিয়ারের পুরোপুরি পাওনা কারণ আমি এই সমস্যাটি কিছুক্ষণ আটকে রেখেছি এবং এই মন্তব্যটি আমার সমস্যাটিকে স্থির করেছে।
Noel

107

যদি টেবিলটি * ngIf এর ভিতরে থাকে তবে এটি কাজ করবে না। এটি [লুকানো] এ পরিবর্তিত হলে এটি কাজ করবে


37
!!! আপনি আমার দিন বাঁচান !!! পরিবর্তে ব্যবহার করুন<div *ngIf="xxx"><div [hidden]="!xxx">
মার্ক

4
নিশ্চিত করতে পারি, এটি আমার পক্ষেও কাজ করেছিল। ধন্যবাদ জার্গ!
Clo5ure

4
আপনাকে অনেক ধন্যবাদ, এটি আমার এত সময় ব্যয় করেছে !!
themightylc

4
অথবা কেবলমাত্র এনজিএফএনটিউটের পরিবর্তে এনজিএফটারভিউআইনিটিতে ডেটা উত্সটি সেট করুন
ব্যবহারকারী3666653

4
এটি সর্বাধিক "লুকানো" সমস্যা যা ঘটতে পারে, সমাধানের জন্য ধন্যবাদ! নথিপত্রগুলি এ সম্পর্কে সতর্ক করতে পারে
রায়চারার

37

ম্যাটকালামডেমফের নাম এবং * ম্যাটসেলডিফের আসল মানের নাম একই হওয়া উচিত

উদাহরণ:

<ng-container matColumnDef="oppNo">
    <th mat-header-cell *matHeaderCellDef mat-sort-header>Opportunity Number</th>
    <td mat-cell *matCellDef="let element">{{element.oppNo}}</td>
</ng-container>

আমার ক্ষেত্রে ম্যাপকলামডিফ নাম এবং * ম্যাটসেলডেফের নাম এবং সাজানোর জন্য জরিমানা opp


মজাদার. আমার ক্ষেত্রেও তা ছিল। তবে, আপনি কি এর পিছনে আসল যুক্তি জানেন বা এটি আসলে কোনও "বাগ"?
রিটারনেবল টেবিল

23

আমিও এই ইস্যুতে আঘাত করেছি। যেহেতু আপনার সন্তানের সংজ্ঞায়িত হওয়ার জন্য অপেক্ষা করতে হবে, আপনাকে AfterViewInitঅনিক্লট নয়, প্রয়োগ করতে হবে এবং ব্যবহার করতে হবে।

  ngAfterViewInit (){
    this.dataSource.sort = this.sort;
  }

অসাধারণ ! ধন্যবাদ
শশাঙ্ক বিবেক

আমি বাছাই, ফিল্টারিং এবং পৃষ্ঠাগুলি সহ একটি টেবিল ব্যবহার করছি। কেবল বাছাইকরণকেই সংজ্ঞায়িত করতে হবে কেন আপনার কোনও ক্লু আছে ngAfterViewInit? বাকিরা কাজ করছিল ngOnInit। এটি কেবল বোঝার চেষ্টা করার জন্য, এটি আপনাকে ধন্যবাদ স্থিরীকৃত
নিকোলাস এম।

23

টাইমআউট ব্লকের মধ্যে বাছাই করা আমার পক্ষে কাজ করে,

dataSource = new MatTableDataSource(this.articleService.getAllArticles());
setTimeout(() => {
  this.tableDataSource.sort = this.sort;
  this.tableDataSource.paginator = this.paginator;
});

আপনি যদি লাইফাইকেল হুক ব্যবহার করতে না চান।


4
বোকা হ্যাক কিন্তু এটি কাজ করে, কোনও ধারণা কেন এটি সময়সীমা ছাড়া কাজ করে না?
রুবেন

আমি পাগল হয়ে যাচ্ছি ভেবে আমি সমস্ত কিছু চেষ্টা করে অনেক দীর্ঘ সময় কাটিয়েছি। মোহন মত কাজ!
willpnw

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

14

আমি এই ইস্যুতে ঘন্টা ব্যয় করেছি। বেশ কয়েকটি থ্রেড পড়ার পরে, আমি যে পদক্ষেপগুলি করেছি তা এখানে।

  1. যেমনটি @avern উল্লেখ করেছেন , আপনার আমদানি করা দরকার MatSortModule
  2. নিশ্চিত করুন যে আপনি একটিতে টেবিলটি আবদ্ধ করছেন না*ngIf@Zerg এর প্রস্তাবিত[hidden] হিসাবে এটিতে পরিবর্তন করুন । (কেন আমি বুঝতে পারি না)

আশাকরি এটা সাহায্য করবে.


সমস্যাটি খুঁজে পেতে আমার দিন নষ্ট করেছে এবং বোকা কোনও ত্রুটি দেখায় না।
নিশ্চিতখা শেলাকে

11

আমার সমাধানটি ছিল বেশ কয়েকটি জিনিস ঠিক করা (মূলত এই পৃষ্ঠার বেশিরভাগ সমাধানগুলিকে মার্জ করা)।

পরীক্ষা করার বিষয়গুলি:

  1. BrowserModule, MatTableModule, MatSortModule মডিউলগুলি রুট মডিউলগুলির ফাইলে আমদানি করা উচিত।
  2. MatTableDatasourceক্লাসটি ব্যবহার করেছেন এবং আপনার ডেটা অ্যারেটিকে প্যারামিটার হিসাবে পাস করার বিষয়টি নিশ্চিত করুন pass
  3. আপনার টেবিলটি কোনও *ngIf=....নির্দেশে বাসা বাঁধছে না তা নিশ্চিত করুন । পরিবর্তে অন্যান্য শর্তসাপেক্ষ অপারেশনগুলি ব্যবহার করুন (এখনও কেন বুঝতে পারছেন না)।

5

আমার জন্য 2 টি সমস্যা ছিল।

  1. ম্যাটকালামডিফ এবং ম্যাটসেলডিফ -> নাম আলাদা are
  2. আমি পরিষেবাটি থেকে ডেটা পাচ্ছিলাম। NgOnInit সাজানো কাজ করছে না। সঙ্গে প্রতিস্থাপিত

    ngAfterViewInit () {this.dataSource.sort = this.sort; }


4

আমি এই পুরানো ব্লগটি পেয়েছি যা এটি আমাকে কাজ করতে সহায়তা করেছে: https://www.jeffryhouser.com/index.cfm/2018/10/23/Five-References-My-ngMaterial-Table-wont-sort

  1. আমদানি নিশ্চিত করুন MatSortModule
  2. matSortশিরোনাম নির্দিষ্ট করুন
  3. আপনার ডেটাসোর্সটি একটিতে মোড়ানো নিশ্চিত করুন MatTableDataSource
    • এই এটিই আমাকে এটিকে বাছাই করতে সহায়তা করেছে (এটি পেয়েছেন? এটি বাছাই করুন )। টেমপ্লেটে আমি সরাসরি অ্যারেটির কথা উল্লেখ করছিলাম ( <table mat-table [dataSource]="this.products" matSort>) তবে কোড ( <table mat-table [dataSource]="this.dataSource" matSort>) টিতে আমার সূচনা হওয়া ডেটাসোর্স অবজেক্টটি ব্যবহার করা উচিত ছিল । ডাটাসোর্স এর মতো শুরু করা হয়dataSource = new MatTableDataSource(this.products)
  4. আপনার ক্রম সম্পর্কে ডেটা উত্সটি বলুন ngOnInit/ এngAfterViewInit
  5. আপনার নিজের সাজান লিখুন, আপনি ব্যবহার করতে না চাইলে MatTableDataSource

3

আমার জন্য * এনজিআইফের পরিবর্তে [লুকানো] অ্যাট্রিবিউটের সাথে মাদুর-টেবিল ট্যাগের কাজ করা হয়েছে। কৌণিক পদার্থ সম্প্রদায়ের বাগ হিসাবে এটি কীভাবে পোস্ট করবেন?


3

আমি আমার দৃশ্যে এটি টেবিলের ডেটা * ম্যাটকলামডিফ হিসাবে একই নাম দিয়ে উদাহরণস্বরূপ:

<!-- Name Column -->
<ng-container matColumnDef="name">
  <mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell>
  <mat-cell *matCellDef="let row"> {{row.name}} </mat-cell>
</ng-container>

পরিবর্তে

<!-- Name Column -->
    <ng-container matColumnDef="userName">
      <mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell>
      <mat-cell *matCellDef="let row"> {{row.name}} </mat-cell>
    </ng-container>

2

ম্যাটসোর্ট কাজ না করার একটি কারণ হ'ল this.dataSource.sort = this.sortএটি সংজ্ঞায়িত হওয়ার আগে এটি যখন ডেটাসোর্সে যুক্ত হয় (যেমন )। এর একাধিক কারণ থাকতে পারে:

  1. আপনি যদি এনজিওএনইনেটে সাজান যোগ করেন। এই মুহুর্তে টেমপ্লেটটি এখনও রেন্ডার হয়নি, সুতরাং আপনার সাথে থাকা ম্যাটসোর্টটি@ViewChild(MatSort, { static: true }) sort: MatSort; এবং বোধগম্যভাবে কিছু করবে না। এই ইস্যুটির সমাধান this.dataSource.sort = sortহ'ল এনজিএফটারভিউআইনিটিতে চলে যাওয়া। যখন এনজিএফটারভিউআইনিটকে আপনার উপাদানটি রেন্ডার করা হয় এবং ম্যাটসোর্টটি সংজ্ঞায়িত করা উচিত।

  2. আপনি যখন টেবিল উপাদানগুলিতে আপনার টেম্পলেটটি * এনজিআইফ ব্যবহার করেন বা এটির মূল উপাদানগুলির একটিতে যদি এই টেমপ্লেটটি হয় এবং এই * এনজিআইফের কারণে আপনি ম্যাটসোর্টটি সেট করার চেষ্টা করার মুহুর্তে আপনার টেবিলটি রেন্ডার না হয়। উদাহরণস্বরূপ, যদি *ngIf="dataSource.data.length > 0"আপনার টেবিলের উপাদান থাকে (কেবলমাত্র সেখানে উপস্থিত ডেটা উপস্থিত থাকে তবে এটি সরবরাহ করতে) এবং আপনি আপনার ডেটা দিয়ে this.dataSource.sort = this.sortসেট this.dataSource.dataকরার পরে ঠিক সেট করেন set উপাদান ভিউটি এখনও রেন্ডার করা হবে না, সুতরাং ম্যাটসোর্টটি এখনও অপরিজ্ঞাত থাকবে।

ম্যাটসোর্টকে কাজ করতে এবং শর্তসাপেক্ষে আপনার টেবিলটি শর্তাধীনভাবে দেখানোর জন্য আপনি এটি প্রতিস্থাপনের সিদ্ধান্ত নিতে পারেন *ngIf সাথে[hidden] একাধিক অন্যান্য উত্তর বলেন। তবে আপনি যদি আপনার * এনজিআই বিবৃতি রাখতে চান তবে নীচের সমাধানটি ব্যবহার করতে পারেন। এই সমাধানটি কৌনিক 9 এর জন্য কাজ করে, আমি এটি পূর্ববর্তী সংস্করণগুলিতে পরীক্ষা করে দেখিনি তাই আমি নিশ্চিত না যে এটি সেখানে কাজ করে কিনা।

আমি এই সমাধানটি এখানে পেয়েছি: https://github.com/angular/components/issues/10205

পরিবর্তে রাখার:

@ViewChild(MatSort) sort: MatSort;

ম্যাটসোর্টের জন্য একটি সেটার ব্যবহার করুন। এই সেটারটি একবার আপনার দর্শন পরিবর্তনের (যেমন প্রথমবার সংজ্ঞায়িত করা হয়েছে) ম্যাটসোর্টটি চালিত হবে, যখন আপনি তীরগুলিতে ক্লিক করে বাছাই করে পরিবর্তন করবেন তখন তা আগুনে কাটাবে না। এটি এর মতো দেখাবে:

@ViewChild(MatSort) set matSort(sort: MatSort) {
    this.dataSource.sort = sort;
}

আপনার যদি অন্য ক্রিয়াকলাপগুলি থাকে (প্রোগ্রামগতভাবে) বাছাই পরিবর্তন করে তবে আমি নিশ্চিত নই যে এটি আবার চালু হবে কিনা, আমি এটি পরীক্ষা করিনি। যদি আপনি নিশ্চিত করতে না চান যে এটি কেবল বাছাইটি সেট করে যদি বাছাই পূর্বনির্ধারিত ছিল, আপনি এই জাতীয় কিছু করতে পারেন:

@ViewChild(MatSort) set matSort(sort: MatSort) {
    if (!this.dataSource.sort) {
        this.dataSource.sort = sort;
    }
}

থানকিউ এমি (এবং অভিজিৎ-নাগারাজা) :-) বাছাইয়ের উপর সেট ফাংশনটি ব্যবহার করে আমার গ্রিডের উপাদানগুলিকে বাছাই করে তোলে জীবনে .. অবশেষে :-)
কিরান রায়ান

2

এই নামগুলির সমান হওয়া সম্পর্কে যে কেউ বিভ্রান্ত হয়ে পড়েছে তাদের জন্য আমি কিছু পরীক্ষা করেছি:

এটি কাজ করবে (সম্পত্তির নাম কলাম ডিএফের সমান):

<ng-container matColumnDef="version">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Version </th>
    <td mat-cell *matCellDef="let element"> {{element.version}} </td>
</ng-container>

displayedColumns: string[] = ['version']

এটি কাজ করবে না (সম্পত্তির নাম কলাম ডিফের মতো নয়):

<ng-container matColumnDef="version2">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Version </th>
    <td mat-cell *matCellDef="let element"> {{element.version}} </td>
</ng-container>

displayedColumns: string[] = ['version2']

Fyi, এটি কাজ করে না (একটি সম্পত্তি দৈর্ঘ্য):

<ng-container matColumnDef="length">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Version </th>
    <td mat-cell *matCellDef="let element"> {{element.ids.length}} </td>
</ng-container>

displayedColumns: string[] = ['length']

এবং উভয়ই এটি করে না:

<ng-container matColumnDef="ids.length">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Version </th>
    <td mat-cell *matCellDef="let element"> {{element.ids.length}} </td>
</ng-container>

displayedColumns: string[] = ['ids.length']

তৃতীয় বিকল্প {{এলিমিটি.ইড.লেন্থ} option এর ক্ষেত্রে, যদি ডেটা ইতিমধ্যে সেইভাবে মডেল করা হয় তবে এর কোনও সমাধান আছে?
প্যাকো জেভালোস

1

যদি আপনার টেবিলটি কোনও * এনজিআইফের অভ্যন্তরে থাকে এবং আপনি যদি ভাবেন যে এটির সাথে আপনার টেবিলটি বাছাই না করে এটির সাথে কিছু করার আছে তবে আপনার নিজের sortingDataAccessorফাংশনটি উল্লেখ করা আমার পক্ষে যেমন সমস্যাটি সমাধান করতে পারে তেমন করে। আমার দু'টি এনজিআইফের ভিতরে আমার টেবিল রয়েছে এবং এটি * এনজিআইফ থেকে বের করে নেওয়া কোনও অর্থবোধ করে না:

`ngAfterViewInit(): void {
        this.matchesDataSource.sort = this.sort;
        this.matchesDataSource.sortingDataAccessor = previewMatchSortingFn;
    }`

`export function previewMatchSortingFn(item: Match, header: string): string | number {
    switch (header) {
        case 'home':
            return item.homeTeam.name;
        case 'away':
            return item.awayTeam.name;
        case 'date':
            if (item.dateTime) {
                // this will return the number representation of the date
                return item.dateTime.valueOf();
            }
            return;
        default:
            break;
    }
}`

0

প্রকৃতপক্ষে matColumnDef নাম (যেমন কলামের নাম) এবং আপনার শ্রেণি / ইন্টারফেসের সম্পত্তি নামটি এটি কার্যকর করতে সমান হওয়া উচিত।

কখনও কখনও আমরা আমাদের শ্রেণি / ইন্টারফেসের সম্পত্তি নাম পরিবর্তন করতে পারি না, সেক্ষেত্রে আমরা নীচের মতো কাস্টম বাছাই বাস্তবায়ন করতে পারি।

let say your columns  as  ['id', 'name'] and 
your class/interface  as  ['userId', 'name']

আমরা যদি 'আইডি' কলামে বাছাই করে কাজ করি তা কার্যকর হবে না। কাস্টম বাছাইয়ের চেষ্টা করুন

this.dataSource.sortingDataAccessor = (item,property)=>{

 // where item is your class/interface data
 // where property is your column name

       switch(property){
           case 'id' : return item.userId
           default: return item[property];
        }
}

0

আপনি যদি এখানে সমস্ত উত্তর পড়ে থাকেন এবং কিছুই সাহায্য না করেন তবে আপনার আমারও একই সমস্যা হতে পারে।

সমস্যা ছিল আমার MatTableDataSourceউদ্দেশ্য

dataSource = new MatTableDataSource<StbElement>(ELEMENT_DATA);

এইচটিএমএল ফাইল ছাড়াই ব্যবহার করা হয়েছিল this

পরিবর্তন করা হচ্ছে:

<table mat-table [dataSource]="dataSource" matSort class="mat-elevation-z8">

প্রতি:

<table mat-table [dataSource]="this.dataSource" matSort class="mat-elevation-z8">

সমস্যা স্থির।


-1

কনসোলে আপনার কোনও জাভাস্ক্রিপ্ট ত্রুটি আছে কিনা তা দেখুন। এটি হতে পারে যে আপনার বাছাই শুরু করার আগে অন্য কোনও জিনিস ব্যর্থ হয়েছিল।

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