Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.06.2016, 21:59
Новичок на форуме
Отправить личное сообщение для craftenergy Посмотреть профиль Найти все сообщения от craftenergy
 
Регистрация: 20.06.2016
Сообщений: 7

Очень странное поведение 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, 20.06.2016 в 22:14.
Ответить с цитированием
  #2 (permalink)  
Старый 21.06.2016, 06:43
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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

Последний раз редактировалось Dilettante_Pro, 21.06.2016 в 07:47.
Ответить с цитированием
  #3 (permalink)  
Старый 21.06.2016, 06:55
Новичок на форуме
Отправить личное сообщение для craftenergy Посмотреть профиль Найти все сообщения от craftenergy
 
Регистрация: 20.06.2016
Сообщений: 7

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, 21.06.2016 в 07:03.
Ответить с цитированием
  #4 (permalink)  
Старый 21.06.2016, 08:00
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

craftenergy,
Чудес не бывает. Или o.value вне зоны видимости для этогт цикла, или значение еще не присвоено - проверьте алертом
Ответить с цитированием
  #5 (permalink)  
Старый 21.06.2016, 16:49
Аспирант
Отправить личное сообщение для fancy Посмотреть профиль Найти все сообщения от fancy
 
Регистрация: 16.12.2014
Сообщений: 67

craftenergy,
Это наша недоработка.
Никак дело не доходит до динамической подгрузки для combo.
Передал разработчикам, постараемся в следующем релизе исправить.
Ответить с цитированием
  #6 (permalink)  
Старый 21.06.2016, 17:56
Новичок на форуме
Отправить личное сообщение для craftenergy Посмотреть профиль Найти все сообщения от craftenergy
 
Регистрация: 20.06.2016
Сообщений: 7

Сообщение от Dilettante_Pro Посмотреть сообщение
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 Посмотреть сообщение
craftenergy,
Это наша недоработка.
Никак дело не доходит до динамической подгрузки для combo.
Передал разработчикам, постараемся в следующем релизе исправить.
Спасибо за ответ, было бы не плохо, если бы в ближайшее время появилась такая возможность! Очень понравилась ваша библиотека, хотелось бы реализовать на ней.

Последний раз редактировалось craftenergy, 21.06.2016 в 18:01.
Ответить с цитированием
  #7 (permalink)  
Старый 21.06.2016, 18:39
Новичок на форуме
Отправить личное сообщение для craftenergy Посмотреть профиль Найти все сообщения от craftenergy
 
Регистрация: 20.06.2016
Сообщений: 7

Dilettante_Pro, Вот сделал скрин куда кликать.
Изображения:
Тип файла: jpg 23456.jpg (242.9 Кб, 7 просмотров)
Ответить с цитированием
  #8 (permalink)  
Старый 21.06.2016, 18:54
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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
	}

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

(кстати, у вас нет графы Количество - есть Остаток, что тоже странно)
Ответить с цитированием
  #9 (permalink)  
Старый 21.06.2016, 18:59
Новичок на форуме
Отправить личное сообщение для craftenergy Посмотреть профиль Найти все сообщения от craftenergy
 
Регистрация: 20.06.2016
Сообщений: 7

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

Первый так же не работает, а второй конечно же работает, мистика.
Ответить с цитированием
  #10 (permalink)  
Старый 21.06.2016, 19:27
Аспирант
Отправить личное сообщение для fancy Посмотреть профиль Найти все сообщения от fancy
 
Регистрация: 16.12.2014
Сообщений: 67

Сообщение от craftenergy Посмотреть сообщение
Спасибо за ответ, было бы не плохо, если бы в ближайшее время появилась такая возможность! Очень понравилась ваша библиотека, хотелось бы реализовать на ней.
Обязательно сделаем.
На следующей неделе должно быть в релизе.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень нужна помощь! Передача кириллицы в функцию JS VADIK_Minvody AJAX и COMET 9 03.06.2015 12:13
Очень простой вопрос про аудио и JS eirnvn jQuery 8 08.07.2013 14:39
Странное поведение Dojo. Kuzya59 Dojo toolkit 4 15.10.2011 15:42
Странное поведение... popov654 Общие вопросы Javascript 6 29.03.2011 05:14
Очень нужна помощь с Ext JS dcbal ExtJS 1 09.07.2010 13:15