Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
ERROR TypeError: data.slice is not a function
#atMatTableDataSource.push../node_modules/@angular/material/esm5/table.es5.js.MatTableDataSource._orderData (table.es5.js:742)
#at MapSubscriber.project (table.es5.js:675)
#atMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (map.js:35)
#atMapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
I am consuming a JSON response and attempting to display it in the UI through angular material mat-table. please find the attached snippet of code and let me know what is the mistake in the code which I have made or do I need to change my approach to achieve this
JSON webservice
"data": [
"action": "Ok",
"created_user": "slstst5",
"latest_instance": 7713997,
"modified_dt": "Thu, 12 Jul 2018 06:27:32 GMT",
"no_of_btl": 159,
"request": 238244193,
"sales_rep": "slstst5",
"status_cd": "Submitted to Prov."
Service.ts
import { Injectable } from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {sot} from './sot.model';
import { Observable } from "rxjs";
@Injectable({
providedIn: 'root'
export class SotServiceService {
private serviceUrl ="service URL";
constructor(private http : HttpClient) { }
getuser():Observable<sot[]>{
return this.http.get<sot[]>(this.serviceUrl);
table.component.ts
import { Component, OnInit, ViewChild } from '@angular/core';
import { Observable } from "rxjs";
import {MatSort, MatSortable, MatTableDataSource,PageEvent, MatPaginator}
from '@angular/material';
import {SotServiceService} from '../sot-service.service';
@Component({
selector: 'app-sot-table',
templateUrl: './sot-table.component.html',
styleUrls: ['./sot-table.component.css']
export class SotTableComponent implements OnInit {
@ViewChild(MatSort) sort: MatSort;
@ViewChild(MatPaginator) paginator : MatPaginator;
dataSource;
//displayedColumns = ['id', 'name', 'username', 'email', 'phone', 'website'];
displayedColumns = ['request', 'status_cd', 'sales_rep', 'created_user',
'modified_dt', 'action','no_of_btl'];
//displayedColumns=['userId','id','title','body']
constructor(private sotservice :SotServiceService) { }
ngOnInit() {
this.sotservice.getuser().subscribe(result => {
if(!result){
return ;
this.dataSource= new MatTableDataSource(result);
this.dataSource.sort= this.sort;
this.dataSource.paginator=this.paginator;
Error snapshot:
–
–
–
Your data
object is inside of the result
object. You will need to do the following:
ngOnInit() {
this.sotservice.getuser()
.subscribe(result => {
if(!result){
return;
this.dataSource= new MatTableDataSource(result.data);
this.dataSource.sort= this.sort;
this.dataSource.paginator=this.paginator;
–
–
This error is due to the array returned by your webservice.
result contains the array of data. To avoid data.slice is not a function error, you will need to point your result to result.data as mentioned by Wesley Coetzee.
You can safely remove observable from the service as well. If you are not sure about the Sot object, replace it with any or remove it
This error also occurs if you have sub-array in result.data as well. In that case you will do something like,
this.dataSource = new MatTableDataSource(res.data.yourSubArray);
My observable stream returns data from local indexedDB storage (no backend), and my mistake was not checking array length of the stream parameter before assigning it to MatTableDataSource, which resulted in the same type error. Here is my fix:
ngOnInit() {
this.dataStream = this.storageService.getDataStream().subscribe((activeDataList: any) => {
if (activeDataList.length) {
this.dataSource = new MatTableDataSource(activeDataList);
Please try change this line this.dataSource = new MatTableDataSource(result);
to this.datasource.result = results['Data']
then have your dataSource initialized just outside of your constructor like dataSource = new MatTableDataSource();
What you'll basically doing here is to tell your code that there is an element named Data in my result so give me the value or data of this element and assign it to my data-source, hope it helps, had the similar issue and this is how I resolved it
just make sure data is an array / list of your expected data for the table, otherwise won't be possible to slice.
simple
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.