Mdb datatable does not rendering data which comes from api i


Topic: Mdb datatable does not rendering data which comes from api in Vue.js

fa. asked 3 years ago

I'm trying to implement a datatable with mdbootstrap in vue.js. I would like to update table data on events and when initialized but it does not work.

Template;

<div class="col-md-12">
    <mdb-datatable
            :data="data"
            striped
            bordered
    />
</div>

Script;

 import { mdbDatatable } from 'mdbvue';

export default {

name: 'userManagement',
components: {
    mdbDatatable
},
data() {
    return {
        className:"",
        classList: [],

        data: {
            columns: [
                {
                    label: 'Name',
                    field: 'className',
                    sort: 'asc'
                }, {
                    label: 'ID',
                    field: 'id',
                    sort: 'asc'
                }
            ],
            rows: [
                {
                    className: 'Tiger Nixon',
                    id:1
                },
                {
                    className: 'Garrett Winters',
                    id:2
                }
            ]
        }
    }
},
methods: {

    getClassList(){
        var _this = this;
        this.$axios.get('my_url/admin/classes').then(function (response) {
            if (response.status === 200) {

                _this.data.rows = [];
                response.data.forEach(function (obj) {
                    let item = {
                        className: obj.className,
                        id: obj.id
                    };
                    _this.data.rows.push(item);
                });
            }
        }).catch(function (err) {
            alert("" + err);
        });
    }
},
mounted(){
    this.getClassList();
},

It always shows default values, I check the data rows from console the value seems to be updated but no change on the datatable.

Any help would be appreciated.

Stackoverflow link


Mikołaj Smoleński staff answered 3 years ago

Hi there,

If You want to pass data from API, please use the following syntax:

<mdb-datatable :data="'https://my-json-server.typicode.com/Rotarepmi/exjson/db'" striped bordered  />

Also, in the next release we will udpate the datatable component, to control the data changes.

Best regards


Eee commented 2 years ago

Does this mean that the "Other JSON structures" feature is not yet available?


Mikołaj Smoleński staff commented 2 years ago

On this page You can find all info about other data structures in datatables: https://mdbootstrap.com/docs/vue/tables/datatables/

Best regards


Eee commented 2 years ago

Hi Mikolaj. I posted the code ( below on this comment ) based on the documentation you've sent in which it didn't work on my end. Any help would be appreciated. Thank you!


Eee answered 2 years ago

Thanks for the reply, Mikolaj!

Anyhow, I've already tried those examples on that documentation. I copied the code in "Other JSON structure" still it didn't work.

Here's my snippet of code:

<template>
    <mdb-datatable
  :data="data"
  striped
  bordered
    />
</template>

<script>
import 'mdbvue/build/css/mdb.css';
import { mdbDatatable } from 'mdbvue';

export default {
   components: {
   mdbDatatable
 },
computed: {
  data() {
    return {
      columns: [],
      rows: []
    }
  },
},
methods: {
filterData(dataArr, keys) {
  let data = dataArr.map(entry => {
    let filteredEntry = {};
    keys.forEach(key => {
      if(key in entry) {
        filteredEntry[key] = entry[key];
      }
    })
    return filteredEntry;
  })
  return data;
}
 },
mounted(){
 fetch('https://jsonplaceholder.typicode.com/users')
  .then(res => res.json())
  .then(json => {
     console.log(json);
    let keys = ["id", "name", "username"];
    let entries = this.filterData(json, keys);
    //columns
    this.data.columns = keys.map(key => {
      return {
        label: key.toUpperCase(),
        field: key,
        sort: 'asc'
      };
    });
    //rows
    entries.map(entry => this.data.rows.push(entry));
    })
    .catch(err => console.log(err));
   }
 }

.dataTables_wrapper { min-width: 80% !important; margin: 70px auto 0px !important; }


Mikołaj Smoleński staff answered 2 years ago

Hi there,

We're currently working on that issue. We'll try to fix it as soon as possible.

Best regards


Mikołaj Smoleński staff answered 2 years ago

Hi there again,

We've found the solution for Your issue. The new code is available here: https://mdbootstrap.com/docs/vue/tables/datatables/#external-api

Also to make sure the data is reactive it's necessary to add the following code to the Datatable component in our package:

watch: {
    data(newVal) {
      this.columns = newVal.columns;
    },
    (...)
}

It will be fixed in the next Vue release.

Best regards


Hi, code from here https://mdbootstrap.com/docs/vue/tables/datatables/#external-api by Other JSON structures doesnt work. How i can show not formatted ajax data?


Mikołaj Smoleński staff commented 2 years ago

Hi there, We're currently working on that issue. It's solved on our development branch and will be released on Monday.

Best regards


Please insert min. 20 characters.
Status

Answered

Specification of the issue
  • User: Free
  • Premium support: No
  • Technology: MDB Vue
  • MDB Version: 5.1.1
  • Device: Macbook air
  • Browser: Chrome
  • OS: macOS High Sierra
  • Provided sample code: No
  • Provided link: Yes