चटाई-मेज छँटाई डेमो काम नहीं कर रहा


107

मैं mat-tableस्थानीय स्तर पर काम करने के लिए छँटाई करने की कोशिश कर रहा हूं , और जब मुझे उम्मीद के मुताबिक डेटा मिल सकता है, हेडर पंक्ति पर क्लिक करना छँटाई नहीं करता है क्योंकि यह ऑनलाइन उदाहरणों पर होता है (कुछ भी नहीं होता है)। मैं इस डेमो को स्थानीय स्तर पर काम करने की कोशिश कर रहा हूं: https://material.angular.io/comports/sort/overview https://plnkr.co/edit/XF5VxOSEBxMTd9Yb3ZLA.p=preview

मैंने कोणीय सीएलआई के साथ एक नई परियोजना बनाई है, फिर इन चरणों का पालन किया: https://material.angular.io/guide/getting-started

यहाँ मेरी स्थानीय फाइलें हैं:

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.component.ts

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

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

app.component.html

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

टेबल-छंटाई-example.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 -->

टेबल-छंटाई-example.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और देखें कि क्या सामने आया है।
केविनेंट

यह मेरे लिए @ViewChild (MatSort) के बिना काम कर रहा है: MatSort; कोई कारण ?
14:123 पर user123456

जवाबों:


198

किसी और के लिए, जिसे यह समस्या हो सकती है: समस्या यह थी कि मैंने कोणीय सामग्री वेबसाइट पर एपीआई संदर्भ को ठीक से नहीं पढ़ा था, जिस हिस्से ने कहा था कि मुझे MatSortModule आयात करना होगा। बाद मैंने अपनी आयात सूची app.module.ts में बदल दी

imports: [
    BrowserModule,
    MatTableModule,
    MatSortModule
  ],

यह ठीक काम किया


45
प्रलेखन में इस मॉड्यूल का कोई उल्लेख नहीं है। material.angular.io/compenders/table/overview#sorting मैंने इस पर एक घंटा भी बर्बाद किया।
सोनिक सोल

8
यह ठीक है, हेडर टेक्स्ट में क्लिक करने योग्य है और आइकन भी है लेकिन फिर भी छँटाई काम नहीं कर रही है।
SPnL

2
BrowserAnimationsModuleयह भी देखें कि क्या app.module.ts में आयात किया गया है
Augustas

2
क्या मैं कह सकता हूं कि वे एसओबी हैं? मैंने 1 घंटे बिताए यह जानने की कोशिश कर रहा था कि मेरा ViewChild काम क्यों नहीं कर रहा है। क्या वे इस MatSortModule को MatTableModule से आयात / निर्यात नहीं कर सकते हैं ??
संप्रग

7
मैं आयात किया है MatSortModuleऔर BrowserAnimationsModule, और मैं यह सुनिश्चित किया है कि matColumnDef मूल्य संपत्ति नाम से मेल खाता है, फिर भी मैं अभी भी यह कुछ भी करने को प्राप्त करने में असमर्थ हूँ।
ट्रेवर

133

मुझे एक समस्या थी कि छँटाई समारोह काम कर रहा था, लेकिन यह ठीक से छँटाई नहीं कर रहा था। मुझे एहसास हुआ कि मेरे 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>घटक।


1
आपके उदाहरण में आप क्या संदर्भित कर रहे हैं? तुलना के लिए यह आपके इंटरफ़ेस को भी देखने में मददगार होगा।
isherwood

1
मैं कॉलम के नाम के रूप में "Id" का उपयोग कर रहा था जबकि इकाई में "id" था। मामला अंतर यह चला रहा था (एक refactoring मिस के कारण) नहीं .. अब इसका हल। धन्यवाद
NitinSingh

2
धन्यवाद, यह बहुत उपयोगी है।
बोहो एलआई

2
@NitinSingh, अगर आपको किसी फ़ंक्शन की आवश्यकता है, तो elementइस तरह से {{row.getName ()}} `
कोडेंटरी

1
मैंने आपको पूरी तरह से बियर पिलाई क्योंकि मैं इस समस्या पर कुछ समय के लिए अटक गया था और इस टिप्पणी ने मेरी समस्या को ठीक कर दिया।
नोएल

99

यदि तालिका * ngIf के अंदर है, तो यह काम नहीं करेगा। अगर यह [छुपा] में बदल जाए तो यह काम करेगा


33
!!! तुम मेरी दिन बचाओ !!! के बजाय का उपयोग करें<div *ngIf="xxx"><div [hidden]="!xxx">
मार्क

1
पुष्टि कर सकते हैं, यह मेरे लिए भी काम किया। धन्यवाद zerg!
clo5ure

1
बहुत बहुत धन्यवाद, यह मुझे इतना समय खर्च किया है !!
थीमाइटेक

1
या सिर्फ ngOnfterit के बजाय ngAfterViewInit में डेटा स्रोत सेट करें
user3666653

1
यह सबसे "छिपी" समस्या है जो हो सकती है, समाधान के लिए धन्यवाद! दस्तावेज इस बारे में चेतावनी दे सकते थे
रेचेर

35

matColumnDef नाम और * matCellDef वास्तविक मान नाम समान होना चाहिए

उदाहरण:

<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>

मेरे मामले में उत्पीड़न matColumnDef नाम और * matCellDef नाम और ठीक काम करने के लिए समान है।


दिलचस्प। यही हाल मेरे लिए भी था। लेकिन, क्या आप इसके पीछे का वास्तविक तर्क जानते हैं या यह वास्तव में एक "बग" का कुछ प्रकार है?
रिटर्नटेबल

22

मेरे लिए टाइमआउट ब्लॉक कार्यों के भीतर सॉर्ट जोड़ना,

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

यदि आप आजीवन हुक का उपयोग नहीं करना चाहते हैं।


1
बेवकूफ हैक लेकिन यह काम करता है, किसी भी विचार क्यों यह समयबाह्य के बिना काम नहीं करता है?
रूबेन

मैंने बहुत देर तक सब कुछ करने की कोशिश की, यह सोचकर कि मैं पागल हो रहा था। एक जादू की तरह काम किया!
4n19

4
वास्तव में यह करने का एक बुरा तरीका है। Itworks क्योंकि आप घटक के आरंभीकरण के बाद कुछ समय गुजरने दे रहे हैं ताकि डेटा स्रोत का निर्माण हो, और फिर आप सॉर्ट और पेजिनेटर जोड़ दें। सबसे अच्छा यह है कि datSource buidling को ngOnInit में ले जाएं और उसके बाद AfterViewInit में सॉर्ट और पेजिनेटर एसिगमेंट को स्थानांतरित करें। यही जीवन रेखा हुक के लिए मौजूद है।
सेलम गेटाचेव

20

मैंने भी इस मुद्दे को मारा। चूंकि आपको बच्चे को परिभाषित करने के लिए प्रतीक्षा करने की आवश्यकता है, इसलिए आपको लागू करना होगा और उपयोग करना होगा AfterViewInit, न कि ऑनिट।

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

बहुत बढ़िया ! साभार
शशांक विवेक

मैं छँटाई, फ़िल्टरिंग और पृष्ठांकन के साथ एक तालिका का उपयोग कर रहा हूँ। क्या आपके पास कोई सुराग है कि केवल छंटाई को किस कारण से परिभाषित किया जाना है ngAfterViewInit? बाकी से काम चल रहा था ngOnInit। यह सिर्फ समझने की कोशिश करना है, यह आपके लिए धन्यवाद तय है
निकोलस एम।

14

मैंने इस मुद्दे पर घंटों बिताए। कई थ्रेड्स के माध्यम से पढ़ने के बाद, यहां मैंने जो कदम उठाए हैं।

  1. जैसा कि @avern ने उल्लेख किया है , आपको आयात करने की आवश्यकता है MatSortModule
  2. सुनिश्चित करें कि आप तालिका को एक में संलग्न नहीं कर रहे हैं *ngIf। इसे @ [hidden]रूप में अनुशंसित रूप में बदलें । (मुझे समझ में नहीं आता क्यों)

उम्मीद है की यह मदद करेगा।


इसके मुद्दे को जानने के लिए मेरा दिन बर्बाद हो गया है और बेवकूफ कोई त्रुटि नहीं दिखाता है।
निश्चय आश्रय

11

मेरा समाधान कई चीजों को ठीक करना था (मूल रूप से इस पृष्ठ के अधिकांश समाधानों को विलय करना)।

जाँच करने के लिए चीजें:

  1. BrowserModule, MatTableModule, MatSortModule मॉड्यूल को मॉड्यूल मॉड्यूल फ़ाइल में आयात किया जाना चाहिए।
  2. उपयोग किए गए MatTableDatasourceवर्ग को सुनिश्चित करें और एक पैरामीटर के रूप में इसमें अपना डेटा ऐरे पास करें
  3. सुनिश्चित करें कि आपकी तालिका एक *ngIf=....निर्देश में नेस्टेड नहीं है । इसके बजाय अन्य सशर्त परिचालनों का उपयोग करें (फिर भी समझ में नहीं आता कि क्यों)।

3

मेरे लिए * एनजीआईएफ की जगह [हिडन] के साथ मैट-टेबल टैग के लिए काम किया। यह एक को कोणीय सामग्री समुदाय के बग के रूप में कैसे पोस्ट करें?


3

मैंने अपने परिदृश्य में इसे उसी नाम से तालिका डेटा नाम देकर तय किया है जैसे * matColumnDef उदाहरण के लिए:

<!-- 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>

3

मेरे लिए 2 मुद्दे थे।

  1. MatColumnDef और matCellDef -> नाम अलग-अलग हैं
  2. मुझे सेवा से डेटा मिल रहा था। NgOnInit सॉर्ट काम नहीं कर रहा था। के साथ बदल दिया

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


2

मुझे यह पुराना ब्लॉग मिला जिसने मुझे इसे प्राप्त करने में मदद की: https://www.jeffryhouser.com/index.cfm/2018/10/23/Five-Reasons-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

1

यदि आपकी तालिका एक * ngIf के अंदर है और आपको लगता है कि इसका आपकी तालिका को क्रमबद्ध नहीं करने के साथ कुछ करना है, तो अपने स्वयं के sortingDataAccessorफ़ंक्शन को निर्दिष्ट करने से समस्या का समाधान हो सकता है जैसा कि मेरे लिए था। मेरे पास * ngIfs के जोड़े के अंदर मेरी तालिका है और इसे उन * ngIfs से बाहर निकालने का कोई मतलब नहीं है:

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

1

MatSort काम न करने के कारणों में से एक है, जब इसे this.dataSource.sort = this.sortपरिभाषित करने से पहले डेटा स्रोत (यानी ) में जोड़ा जाता है। इसके कई कारण हो सकते हैं:

  1. यदि आप ngOnInit में सॉर्ट जोड़ते हैं। इस बिंदु पर टेम्प्लेट अभी तक प्रदान नहीं किया गया है, इसलिए आपके साथ मिलने वाला MatSort @ViewChild(MatSort, { static: true }) sort: MatSort;अपरिभाषित है और समझदारी से कुछ भी नहीं करेगा। इस समस्या का समाधान this.dataSource.sort = sortngAfterViewInit पर जाना है। जब ngAfterViewInit कहा जाता है तो आपका घटक प्रदान किया जाता है, और MatSort को परिभाषित किया जाना चाहिए।

  2. जब आप * ngIf का उपयोग करते हैं तो आपके टेबल तत्व पर आपका टेम्प्लेट होता है या यदि यह मूल तत्व है और यह * ngIf आपके टेबल को उस समय प्रदान नहीं किया जाता है जब आप MatSort सेट करने का प्रयास करते हैं। उदाहरण के लिए, यदि आपके पास *ngIf="dataSource.data.length > 0"अपने टेबल एलिमेंट पर है (केवल यह प्रस्तुत करने के लिए कि डेटा मौजूद है) और आपने अपने डेटा के साथ this.dataSource.sort = this.sortसेट करने के बाद सही सेट this.dataSource.dataकिया है। घटक दृश्य अभी तक फिर से प्रस्तुत नहीं किया जाएगा, इसलिए MatSort अभी भी अपरिभाषित रहेगा।

आदेश में काम करने के लिए MatSort हो और अभी भी सशर्त अपनी मेज आप को बदलने के लिए निर्णय ले सकते हैं करने के लिए *ngIfके साथ [hidden]के रूप में कई अन्य उत्तर में कहा गया है। हालाँकि, यदि आप अपना * ngIf स्टेटमेंट रखना चाहते हैं, तो आप निम्न समाधान का उपयोग कर सकते हैं। यह समाधान कोणीय 9 के लिए काम करता है, मैंने पिछले संस्करणों पर इसका परीक्षण नहीं किया है इसलिए मुझे यकीन नहीं है कि यह वहां काम करता है।

मुझे यह समाधान यहां मिला: https://github.com/angular/compenders/issues/10205

डालने के बजाय:

@ViewChild(MatSort) sort: MatSort;

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

0

देखें कि क्या आपके पास कंसोल में कोई जावास्क्रिप्ट त्रुटि है। यह हो सकता है कि आपकी छँटाई शुरू करने से पहले कोई और बात विफल हो जाए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.