Пример стола Meteor Handsontable

у кого-нибудь есть рабочий пример использования метеора и handsontable для создания реактивной таблицы для чтения и обновления данных?

Заранее благодарю за любую помощь


person Lobosan    schedule 30.12.2014    source источник
comment
Sup @lobosan, уже что-то пробовали? какой-то пакет? проверьте этот пакет handsontable package, я думаю, если вы спросите какой-нибудь пример или демонстрацию, это немного людям трудно прийти и помочь, если вы примете совет, попробуйте какой-нибудь код (может быть, пакет) самостоятельно, и если вы застряли, вернитесь сюда и попробуйте спросить, но с некоторыми ссылками на код или что-то в этом роде.   -  person Ethaan    schedule 30.12.2014
comment
Удалось ли вам собрать минимальную рабочую демонстрацию? Если да, не могли бы вы поделиться им как приложением для метеора? Благодарность   -  person pihentagy    schedule 16.10.2015


Ответы (1)


Следующий пример работает как реактивная таблица, которая считывает и записывает данные, включая вставку и автозаполнение.

Я не знаю смарт-пакета Meteor, который делает доступным стандартный API Handsontable. (Есть один smartpackage от Olragon, но он предназначен для jQuery API Handsontable). Вы можете довольно легко добавить файлы в свой проект напрямую:

  • Загрузите последнюю версию с https://github.com/handsontable/handsontable/releases.
  • Разархивируйте и скопируйте dist/handsontable.full.js и dist/handsontable.full.css в один из клиентских каталогов вашего проекта (например, /client/lib/)
  • Откройте handsontable.full.js и измените следующую строку:

    // Remove "var" from Handsontable declaration to add to global scope
    var Handsontable = function (rootElement, userSettings) {
     ...
    
    // New code
    Handsontable = function (rootElement, userSettings) {
     ...
    
  • Возможно, вам потребуется удалить все существующие смарт-пакеты Handsontable.

Затем добавьте новый шаблон в свой html, где будет находиться ваш Handsontable:

<template name="handsontable">
<div class="handsontable" id="hot"></div>
</template>

Наконец, в вашем файле js:

Meteor.isClient {
 Template.handsontable.rendered = function () {
  var myData = [];  // Need this to create instance
  var container = document.getElementById("hot"); 
  var hot = new Handsontable(container,{  // Create Handsontable instance
    data: myData,
    startRows: 5,
    startCols: 5,
    colHeaders: true,
    minSpareRows: 1,
    contextMenu: true,
    afterChange: function (change, source) {  // "change" is an array of arrays. 
      if (source !== "loadData") {  // Don't need to run this when data is loaded
        for (i = 0; i < change.length; i++) {   // For each change, get the change info and update the record
            var rowNum = change[i][0]; // Which row it appears on Handsontable
            var row = myData[rowNum];  // Now we have the whole row of data, including _id
            var key = change[i][1];  // Handsontable docs calls this "prop"
            var oldVal = change[i][2];
            var newVal = change[i][3];
            var setModifier = {$set: {}};   // Need to build $set object
            setModifier.$set[key] = newVal; // So that we can assign 'key' dynamically using bracket notation of JavaScript object
            MyCollection.update(row._id,setModifier); 
        }               
      }
    }
  });  

  Tracker.autorun( function () {  // Tracker function for reactivity
      myData = MyCollection.find().fetch();  // Tie in our data
      hot.loadData(myData);
  });
 };
}

Документация по afterChange API находится здесь: https://github.com/handsontable/handsontable/wiki/Events

Этот код автоматически отображает поля вашей коллекции в виде столбцов, включая столбец _id. Чтобы определить столбцы с помощью Handsontable в Meteor, вот пример документа в коллекции образцов Books:

{_id: 'Hneb7LxFRptXCiL49',
 title: 'The Name of the Wind',
 author: 'Patrick Rothfuss',
 copies: 3 }

Мы можем указать наши столбцы, чтобы _id не отображался, а также (необязательно) дать имена нашим colHeaders:

// replace at "colHeaders":
colHeaders: ['Title','Author','Copies'],
columns: [
  {data: 'title'},
  {data: 'author:},
  {data: 'copies'}
],
// ...
person Mufasa    schedule 31.12.2014
comment
Привет @Mufasa, спасибо за ответ. Ваш код работает, но в первом столбце отображается идентификатор документов. Я пытаюсь скрыть столбец № 0, добавив это свойство конфигурации Handsontable , columns: [{data: 1}, {data: 2}, {data: 3}], но тогда вся таблица не отображается. Та же проблема, когда я использую ячейки свойств. Любое предложение. заранее спасибо - person Lobosan; 06.01.2015
comment
Смотрите обновленный ответ. Вы указываете столбцы как: [{data:'field1'},{data:'field2'}] - person Mufasa; 07.01.2015
comment
Кстати, вы не можете ссылаться на столбцы, как вы указали, потому что вы работаете с массивом объектов (потому что вы используете коллекцию Meteor), а не с двумерным массивом. См. примеры источников данных Object в документах HT handsontable.com/demo/datasources.html. - person Mufasa; 07.01.2015
comment
Большое спасибо @Mufasa за ваше терпение и подробную поддержку. Сейчас код работает довольно хорошо. Продолжайте усердно работать, как вы это делаете, и ваша репутация будет расти все выше и выше. Всего наилучшего ;) - person Lobosan; 07.01.2015
comment
Хорошо, я смог выполнить то, что находится в текущем посте. Я пропустил часть вставки-удаления. Поэтому я добавил хук afterCreateRow, но когда я делаю вставку в afterCreateRow, это вызывает бесконечный цикл. - person pihentagy; 03.11.2015