Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Очень странное поведение JS с библиотекой FancyGrid (https://javascript.ru/forum/misc/63655-ochen-strannoe-povedenie-js-s-bibliotekojj-fancygrid.html)

craftenergy 20.06.2016 21:59

Очень странное поведение 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/

Dilettante_Pro 21.06.2016 06:43

craftenergy,
o.value уже с рублями?
И еще: массивы обычно индексируются с 0
Каким чудом у вас нулевой элемент получает значение 1?

craftenergy 21.06.2016 06:55

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": ""
    }]
}

Dilettante_Pro 21.06.2016 08:00

craftenergy,
Чудес не бывает. Или o.value вне зоны видимости для этогт цикла, или значение еще не присвоено - проверьте алертом

fancy 21.06.2016 16:49

craftenergy,
Это наша недоработка.
Никак дело не доходит до динамической подгрузки для combo.
Передал разработчикам, постараемся в следующем релизе исправить.

craftenergy 21.06.2016 17:56

Цитата:

Сообщение от Dilettante_Pro (Сообщение 420059)
craftenergy,
Чудес не бывает. Или o.value вне зоны видимости для этогт цикла, или значение еще не присвоено - проверьте алертом

Как раз таки alert и console.log показывают, что переменная не пуста и имеет численное значение.

Вот накидал тестовую страницу, чтобы показать на пальцах:
http://vapeshop22.ru/test.html

Сделал 2 таблички, в первой конечное значение цикла for берется из значения полученного через ajax - stock (o.value), а во второй табличке принудительно присваивается значению 50, код полностью идентичен, за исключением присвоения конечного значения цикла.

Если два раза кликнуть по количеству в первой табличке видно что тип combo создался и работает правильно, чего при клике по количеству в первой табличке не происходит, т.к значение data = array("1"), т.е. одному элементу.

p.s. в консоли можно посмотреть что o.value имеет значение, причем числовое, это я и считаю очень странным.

Цитата:

Сообщение от fancy (Сообщение 420091)
craftenergy,
Это наша недоработка.
Никак дело не доходит до динамической подгрузки для combo.
Передал разработчикам, постараемся в следующем релизе исправить.

Спасибо за ответ, было бы не плохо, если бы в ближайшее время появилась такая возможность! Очень понравилась ваша библиотека, хотелось бы реализовать на ней.

craftenergy 21.06.2016 18:39

Вложений: 1
Dilettante_Pro, Вот сделал скрин куда кликать.

Dilettante_Pro 21.06.2016 18:54

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
	}

Такой вот танец с бубном

(кстати, у вас нет графы Количество - есть Остаток, что тоже странно)

craftenergy 21.06.2016 18:59

Цитата:

Сообщение от Dilettante_Pro (Сообщение 420101)
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
	}

Первый так же не работает, а второй конечно же работает, мистика.

fancy 21.06.2016 19:27

Цитата:

Сообщение от craftenergy (Сообщение 420096)
Спасибо за ответ, было бы не плохо, если бы в ближайшее время появилась такая возможность! Очень понравилась ваша библиотека, хотелось бы реализовать на ней.

Обязательно сделаем.
На следующей неделе должно быть в релизе.


Часовой пояс GMT +3, время: 14:33.