Angular 6 DataTables - элементы таблицы появляются / исчезают при сортировке или поиске - PullRequest
0 голосов
/ 06 июля 2018

Я использую Angular-DataTables 6.0 (можно найти здесь https://l -lin.github.io / angular-datatables / # / welcome ), и я столкнулся с повторяющейся проблемой. Когда элемент таблицы добавляется или удаляется, запись либо исчезает, либо появляется снова при сортировке или поиске. Возможно ли это потому, что добавление / удаление происходит за пределами dataTable?

Я попытался добавить исправление 'datatable = "ng", предложенное многими другими, но это ничего не изменило. Я также попытался добавить функцию повторного рендеринга, но в этом случае я столкнулся с ошибками «объект отписался», которые я не смог устранить. Для справки, некоторые похожие проблемы могут быть найдены здесь: Подобные примеры включают: ( angular: потерянные данные после сортировки datatable ) ( Сортировка чисел в скобках в угловых таблицах данных ) (https://github.com/l-lin/angular-datatables/issues/852)

Вот мой код:

HTML:
  <table datatable="ng" [dtOptions]="dtOptions" [dtTrigger]="dtTrigger" class="table table-hover" id="t1">
                <thead>
                        <tr>
                                <th>
                                    <button id="b5">Asset ID</button>
                                </th>
                                <th>
                                    <button id="b5">Employee ID</button>
                                </th>
                                <th>
                                    <button id="b5">Asset Type</button>
                                </th>
                                <th>View</th>
                                <th>Delete</th>
                              </tr>
                              </thead>
        <tbody>
        <tr *ngFor="let a of assets; let i = index"> 
          <td>{{ a.assetID }}</td>
          <td>{{ a.currentUser }}</td>
          <td>{{ a.assetType }}</td>
          <td><button id="button1" (click)="viewAsset(a)"><i class="fas fa-search"></i></button></td>
          <td><button id="b2" class="btn" (click)="scrapAsset(a)" (mouseenter)="buttonHover(i)" (mouseleave)="buttonHoverLeave(i)"><i class="{{buttonIconArray[i].text}}"></i></button></td>
        </tr>
        </tbody>
        </table>
-elsewhere in the code-
         <button class="btn" id="b1" (click)="addAsset()">Add New Asset</button>&nbsp;

TS

   dtOptions: DataTables.Settings = {};
   dtTrigger = new Subject();

 addAsset()
 {
this.confirmChanges = false;
//Create a new asset:
let a: Asset = {
  assetID: this.assetID,
  currentUser: this.currentUser,
  assetType: this.dropdownMessage,

}
//send a notification to the user that owns the new asset
  let notify: Notice = {
  emplyID: a.currentUser,
  notificationSource: "Asset",
  details: "A new " + this.dropdownMessage + " was added to your assets.",
  timeStamp: new Date()
}

//Add the asset to the server
this.AssetsService.addAsset(a)
      .subscribe(asset => { this.assets.unshift(asset);
                            //All of the inputs need to be emptied
                            this.clearFields(); 
                          })
}

scrapAsset(a: Asset)
{
console.log("The ID is " , a.assetID)
//this.AssetsService.deleteAsset(this.currentAsset).subscribe()
this.confirmChanges = false;



//This deletes the asset from the back-end.
this.AssetsService.deleteAsset(a).subscribe(() => { 
  console.log('test')
  this.assets = this.assets.filter(t => t !== a);
  this.NotificationsService.addNotice(notify).subscribe();
  this.clearFields(); });
  }

dtActivate()
 {
this.dtOptions = {
pagingType: 'full_numbers',
pageLength: 7,
order: (this.assets.assetType),
orderClasses: false,
};
this.AssetsService.getAssetsIT().subscribe((assetsImported) => {
this.assets = assetsImported;
this.parseData();
  // Calling the DT trigger to manually render the table
  this.dtTrigger.next();
});
}

Это только частичная часть кода, поэтому, если вам нужно увидеть больше, просто спросите. Спасибо за любую помощь, которую вы можете оказать!

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вы можете удалить нг, следующий код исправил мою проблему

<div class="container-fluid">
    <div class="page-title">
        <h4>Milk Types</h4>
    </div>
    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-block">  

                    <a href="" class="btn btn-success" href=''  [routerLink]="['/milk/create-milk']">
                        <i class="ti-zip pdd-right-5"></i>
                        <span>Add New Milk</span>
                    </a>

                    <div class="table-overflow">
                        <table class="table table-lg table-hover" datatable [dtTrigger]="dtTrigger" [dtOptions]="dtOptions">
                            <thead>
                                <tr>                                    
                                    <th>ID</th>
                                    <th>Name</th>
                                    <th>Status</th>
                                    <th>Price</th>
                                    <th></th>   
                                </tr>
                            </thead>
                            <tbody>
                                <tr *ngFor="let drink of data">                                    
                                    <td>
                                        <div class="mrg-top-15">
                                            <b class="text-dark font-size-16">{{ drink.id }}</b>
                                        </div>
                                    </td>
                                    <td>
                                        <div class="mrg-top-15">
                                            <span class="text-info pdd-left-20"><b>{{ drink.name }}</b></span>
                                        </div>
                                    </td>  
                                    <td>
                                            <div class="col-md-5">
                                                    <div class="toggle-checkbox toggle-success checkbox-inline">
                                                    <input type="checkbox" name="isEnabled" id="toggle4" [checked]="drink.isEnabled">
                                                    <label for="toggle4"></label>
                                                    </div>
                                            </div>
                                    </td>
                                    <td>
                                        <div class="mrg-top-15">
                                            <span class="text-info"><b>KD {{ drink.price }}</b></span>
                                        </div>
                                    </td>  
                                    <td>
                                        <div class="mrg-top-10 text-center">
                                            <a href="" class="btn btn-warning">
                                                <i class="ti-comment pdd-right-5"></i>
                                                <span>Edit</span>
                                            </a>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table> 
                    </div>
                </div>
            </div>
        </div>
    </div>  
</div>    



import { Component, OnInit, Input, OnDestroy , ViewEncapsulation } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';
import { pipe, Subscription } from 'rxjs';
import { MilksItem, MilksDataSource } from './milks-datasource';
import { Subject } from 'rxjs';

@Component ({
    templateUrl: 'milk.html'
})

export class MilkComponent implements OnInit {

    dtOptions: DataTables.Settings = {};
    subscription: Subscription;
    data: MilksItem[] = [];
    dtTrigger: Subject<MilksItem> = new Subject();

    constructor(private db: AngularFireDatabase) 
    {

    }

    ngOnInit() {

        this.dtOptions = {
            pagingType: 'full_numbers'
        };

        this.subscription = this.db.list<MilksItem>('milkTypes').valueChanges().subscribe(d=>{
          console.log('data streaming');
          this.data = d;
          this.dtTrigger.next();
        });    
    }

    ngOnDestroy(): void {
        this.subscription.unsubscribe();
        this.dtTrigger.unsubscribe();
    }
}
0 голосов
/ 07 января 2019

У меня была такая же проблема в течение длительного времени. После большого количества переполнения стека и документации я нашел решение, которое решило мою проблему. Может быть, это вам тоже поможет.

Разрешить уничтожение данных

ngOnInit() {
  this.dtOptions = {
    destroy: true,
    ...
  };
  ...
}

Метод, который получил новые элементы (вызывается после редактирования, вставки, добавления ...).

onReceived(items){
    let isFirst = this.items.length === 0;
    this.items = <itemsModel[]>items;

    if (isFirst)
      this.dtTrigger.next();
    else
      this.rerender();
}

Повторное отображение, как в документации

rerender(): void {
    this.dtElement.dtInstance.then((dtInstance: DataTables.Api) => {
        dtInstance.destroy();
        this.dtTrigger.next();
    });
}

https://l -lin.github.io / угловатые-DataTables / # / расширенный / * 1014 повторно вызывать *

Я надеюсь, что это может помочь вам.

0 голосов
/ 30 сентября 2018

это будет работать, но я все еще ищу лучшие решения setTimeout(function () {$(function () {$('#ng').DataTable();});}, 10);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...