Очень странное поведение JS с библиотекой FancyGrid
Всем привет, в программировании далеко не новичек, в том числе на js, но данная ситуация ввела в ступор, понять не могу по какой причине не работает то что я хочу сделать...
Вообщем в чем суть: Разбираюсь с библиотекой FancyGrid, необходимо получить с сервера поля: Наименование товара, Количество, Цена Поле Количество должно содержать раскрывающийся список со значениями: от 1 до <количества товара>... В библиотеке есть тип поля "combo", при его использовании ячейка превращается в раскрывающийся список, все работает, но при статическом задании данных. Например:
columns: [
{
index: 'stock',
title: 'Количество',
type: 'combo',
data: ['1', '2', '3']
}
<...>
Но при попытке использовать тип "combo" с динамическими данными ничего работать не хочет... в ячейке тупо выводится входной массив строкой... Например для количества 5 (с сервера передается массив [1,2,3,4,5]): 1,3,3,4,5 Хотя поидее должен быть раскрывающийся список... Для того чтобы заработало надо каким-то чудесным образом заполнить массив data, что при динамической погрузке данных не получается... пробовал так:
columns: [
{
index: 'stock',
title: 'Количество',
type: 'combo',
data: stock
}
<...>
но ничего не работает, "stock" не является переменной, в документации по этому поводу ни слова, а в примерах использования библиотека с ajax толи специально не используют другие типы кроме string... одни примеры со string ячейками... Ладно, плюнул на это, нашел в документации функцию в конфигурации ячейки "render()", с помощью ее можно как угодно изменить входные данные и вернуть измененные обратно в ячейку... например можно задать формат ячейке:
render: function(o){
o.value = o.value + ' руб.';
return o;
}
Посмотрел структуру объекта который можно изменить функцией render()... нашел где должны быть данные массива "data". Присваиваю его вручную: o.column.data = new Array() o.column.data[0]=1 o.column.data[1]=2 o.column.data[2]=3 o.column.data[3]=4 Все замечательно работает! Далее пробую сделать динамическую генерацию этого массива, на входе у меня есть максимальное значение количества, это переменная - o.value. Делаю так:
o.column.data = new Array()
for (var i=1;i<o.value;i++){
o.column.data[i] = i
}
Но не тут то было! Ничего правильно работать не хочет, создается только 1 элемент массива! [0]=1 И всё! Тут же делаю например так:
o.column.data = new Array()
for (var i=1;i<9;i++){
o.column.data[i] = i
}
И о чудо, работает: [0]=1 [1]=2 [2]=3 [3]=4 [4]=5 [5]=6 [6]=7 [7]=8 [8]=9 В этом собственно и вопрос, что это черт возьми за мистика! Сначала думал что o.value не является числовым... всяческие преобразования (Number(o.value), o.value*1 и тп) результату не дают, тоже самое, в массив заносится только 1 элемент! Надеюсь понятно объяснил... может быть я изобретаю велосипед и есть другой способ динамически создать combo ячейку.... ссылка на документацию: fancygrid.com/docs/ |
craftenergy,
o.value уже с рублями? И еще: массивы обычно индексируются с 0 Каким чудом у вас нулевой элемент получает значение 1? |
o.value - это в данном случае количество товаров (stock), просто число типа int. Да я знаю, там должно быть i-1, я для примера написал там.
Вот пример ответа сервера:
{
"count": 2,
"data": [{
"product_id": 1,
"variant_id": 1,
"product_name": "Наименование товара 1",
"variant_name": "Красный",
"variant_sku": "710000010206",
"price": "1000.00",
"stock": 18,
"image": ""
},
{
"product_id": 2,
"variant_id": 2,
"product_name": "Наименование товара 2",
"variant_name": "Черный",
"variant_sku": "710000010560",
"price": "500.00",
"stock": 2,
"image": ""
}]
}
|
craftenergy,
Чудес не бывает. Или o.value вне зоны видимости для этогт цикла, или значение еще не присвоено - проверьте алертом |
craftenergy,
Это наша недоработка. Никак дело не доходит до динамической подгрузки для combo. Передал разработчикам, постараемся в следующем релизе исправить. |
Цитата:
Вот накидал тестовую страницу, чтобы показать на пальцах: http://vapeshop22.ru/test.html Сделал 2 таблички, в первой конечное значение цикла for берется из значения полученного через ajax - stock (o.value), а во второй табличке принудительно присваивается значению 50, код полностью идентичен, за исключением присвоения конечного значения цикла. Если два раза кликнуть по количеству в первой табличке видно что тип combo создался и работает правильно, чего при клике по количеству в первой табличке не происходит, т.к значение data = array("1"), т.е. одному элементу. p.s. в консоли можно посмотреть что o.value имеет значение, причем числовое, это я и считаю очень странным. Цитата:
|
Вложений: 1
Dilettante_Pro, Вот сделал скрин куда кликать.
|
craftenergy,
Да, странно... А если через промежуточную переменную?
o.column.data = new Array()
console.log('o.value = '+o.value)
var limit = parseInt(o.value)
for (var i=1;i<limit;i++){
o.column.data[i-1] = i
}
Такой вот танец с бубном (кстати, у вас нет графы Количество - есть Остаток, что тоже странно) |
Цитата:
Добавил в файлик варианты:
var temp = parseFloat(o.value)
for (var i=1;i<temp;i++){
o.column.data[i-1] = i
}
и
var temp = 50
for (var i=1;i<temp;i++){
o.column.data[i-1] = i
}
Первый так же не работает, а второй конечно же работает, мистика. |
Цитата:
На следующей неделе должно быть в релизе. |
Цитата:
|
Вышел новый релиз 1.1.4
Относительно combo обновленная документация http://fancygrid.com/api/config/columns/data Я здесь бывают довольно редко поэтому если возникнут вопросы пишите: support@fancygrid.com |
Цитата:
Можно закрывать тему. |
| Часовой пояс GMT +3, время: 19:35. |