Очень странное поведение 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 } Первый так же не работает, а второй конечно же работает, мистика. |
Цитата:
На следующей неделе должно быть в релизе. |
Часовой пояс GMT +3, время: 14:33. |