2016-11-25 2 views
1

Я пытаюсь использовать плагин bootstrap-table, чтобы отобразить мои данные json в таблице. Данные загружаются успешно, однако плагин не отображает данные в таблице, он просто говорит No matching records found.Bootstrap-Table не отображает данные JSON (но загружает их успешно)

Я следовали примеры в документации, пытался использовать такие методы, как load и refresh, хотя по the example I almost copy-pasted, вам не нужно использовать какие-либо методы для загрузки и отображения данных, вы просто должны указать либо атрибут data-url в теге table, либо добавить свойство url на объект таблицы в файле js. Я пробовал оба варианта, и ни один из них не работал.

Вот как я определяю мой стол:

<h1>Table</h1> 
<div id="toolbar"> 
    <button id="remove" class="btn btn-danger" disabled=""> 
     <i class="glyphicon glyphicon-remove"></i> 
     Delete 
    </button> 
</div> 

<table 
    id="table" 
    data-url="/books/all" 
    data-toolbar="#toolbar" 
    data-search="true" 
    data-sortable="true" 
    data-show-refresh="true" 
    data-show-toggle="true" 
    data-show-columns="true" 
    data-show-export="true" 
    data-detail-view="true" 
    data-detail-formatter="detailFormatter" 
    data-minimum-count-columns="2" 
    data-show-pagination-switch="true" 
    data-pagination="true" 
    data-id-field="id" 
    data-page-list="[10, 25, 50, 100, ALL]" 
    data-show-footer="false" 
    data-side-pagination="server" 
    data-response-handler="responseHandler"> 
</table> 

The /books/all возвращает JSON данных, как это:

[{"id":42 
    "name":"whatever", 
"description":"whatever" 
"cover_img":"https://whatever.jpg" 
"available_count":10, 
"price":6.99, 
"author_id":21, 
"publisher_id":5, 
"author_first_name":"Harper", 
"author_last_name":"Lee", 
"author_birthday":"1926-04-27T22:00:00.000Z", 
"publisher_name":"Penguin Fiction"},...] 

Я определить мои столбцы в ЯШ:

let $table = $('#table'), 
    $remove = $('#remove'), 
    selections = []; 

const initTable =() => { 
    $table.bootstrapTable({ 
     url: '/books/all', 
     height: getHeight(), 
     columns: [ 
      [ 
       { 
        field: 'state', 
        checkbox: true, 
        rowspan: 2, 
        align: 'center', 
        valign: 'middle' 
       }, { 
        title: 'Book ID', 
        field: 'id', 
        rowspan: 2, 
        align: 'center', 
        valign: 'middle', 
        sortable: true, 
        footerFormatter: totalTextFormatter 
       }, { 
        title: 'Book Detail', 
        colspan: 3, 
        align: 'center' 
       } 
      ], 
      [ 
       { 
        field: 'name', 
        title: 'Book Name', 
        sortable: true, 
        editable: true, 
        align: 'center', 
        footerFormatter: totalNameFormatter 
       }, { 
        field: 'price', 
        title: 'Book Price', 
        sortable: true, 
        align: 'center', 
        editable: { 
         type: 'text', 
         title: 'Book Price', 
         validate(value) { 
          value = $.trim(value); 

          if (!value) { 
           return 'This field is required'; 
          } 

          if (!/^\$/.test(value)) { 
           return 'This field needs to start with $'; 
          } 

          const data = $table.bootstrapTable('getData'), 
            index = $(this).parents('tr').data('index'); 
          console.log(data[index]); 
          return ''; 
         } 
        }, 
        footerFormatter: totalPriceFormatter 
       }, { 
        field: 'operate', 
        title: 'Book Operate', 
        align: 'center', 
        events: operateEvents, 
        formatter: operateFormatter 
       } 
      ] 
     ] 
    }); 

    setTimeout(() => { 
     $table.bootstrapTable('resetView'); 
    }, 200); 

    $table.on('check.bs.table uncheck.bs.table ' + 
     'check-all.bs.table uncheck-all.bs.table', 
     () => { 
      $remove.prop('disabled', !$table.bootstrapTable('getSelections').length); 

      selections = getIdSelections(); 
    }); 

    $table.on('expand-row.bs.table', (e, index, row, $detail) => { 
     if (index % 2 == 1) { 
      $detail.html('Loading from ajax request...'); 
      $.get('LICENSE', res => { 
       $detail.html(res.replace(/\n/g, '<br>')); 
      }); 
     } 
    }); 

    $table.on('all.bs.table', (e, name, args) => { 
     console.log(name, args); 
    }); 

    $remove.click(() => { 
     const ids = getIdSelections(); 
     $table.bootstrapTable('remove', { 
      field: 'id', 
      values: ids 
     }); 
     $remove.prop('disabled', true); 
    }); 

    $(window).resize(() => { 
     $table.bootstrapTable('resetView', { 
      height: getHeight() 
     }); 
    }); 
}; 


function getIdSelections() { 
    return $.map($table.bootstrapTable('getSelections'), row => row.id) 
} 

function responseHandler(res) { 
    $.each(res.rows, (i, row) => { 
     row.state = $.inArray(row.id, selections) !== -1; 
    }); 
    return res; 
}; 

load-success.bs.table событие получает данные каждый раз, когда я обновляю либо страницу, либо та BLE. Также запускается функция responseHandle и получает одинаковые действительные данные.

Формат данных JSON является действительным, и если я просто скопировать ответ от /books/all запроса и вставить его в data свойство в bootstrapTable объекта инициализации (только после columns собственности), данные будут предоставляться в обычном режиме.


Не могли бы вы помочь мне понять, что я делаю неправильно и решить эту проблему?

ответ

0

Я думаю, что вы просто не хватает дополнительной информации в формате JSON, где он указывает число строк, и охватывает фактические данные в пределах строки объекта, например:

{ 
    "total": 2, 
    "rows": [ 
    { 
    "id":42 
    "name":"whatever", 
    "description":"whatever" 
    "cover_img":"https://whatever.jpg" 
    "available_count":10, 
    "price":6.99, 
    "author_id":21, 
    "publisher_id":5, 
    "author_first_name":"Harper", 
    "author_last_name":"Lee", 
    "author_birthday":"1926-04-27T22:00:00.000Z", 
    "publisher_name":"Penguin Fiction" 
    }, 
    ...] 
}