how to dynamic change richselect(combo, select) options to item in datatable

edited June 2015 in Technical questions
var dlg= webix.ui({
  view: "datatable",
  id: "dt",
  width: 400,
  height: 400,
  editable: true,
  columns: [
    {id: "condition", width: 100, editor: "richselect", options: []}//"aa","bb"]}
  ]
});
var item_id=$$("dt").add({condition: ""});
$$("dt").getItem(item_id).condition.options = ["cc","dd"];

I can use similar code in normal "richselect", but can't use to change options to item in datatable

Comments

  • You can't define collection of options for each column, it can be defined only for all cells in the column

    If you need to show different options in the editor, you can use onAfterEditStart API to catch the moment when the editor is visible and update a content of the editor from this event handler.

  • got it

  • Hi maksim, Could you please provide a sample code snippet for this?
    (I'm trying to conditionally change the options of a combo when edit starts.)

  • edited March 2017

    Hi @Baga,

    Here's a quick sample

    http://webix.com/snippet/44b849f7

    But in such case, the best practice if to filter options, i.e.

    filter can be a more complex function

    list.filter(function(itemObj){
        return true; //false;
    })
    

    depending on some conditions, each item (itemObj) can be displayed or not.

    http://webix.com/snippet/b11e53c5

    Please check the related topic with more complex samples:

    http://forum.webix.com/discussion/comment/9447/#Comment_9447

  • great Thanks!

  • edited July 2018

    Спасибо за ваш пример!

    Но есть один нюанс. Если изначально инициировать опции как массив ["option1", "optinon1"] объект коллекции this.getColumnConfig(id.column).collection не создается! Соответсвенно методы clearAll() и parse() недоступны.

    https://snippet.webix.com/u4tz16kr

    А ведь в документации по API сказано что такая инициация тоже разрешается.

  • Здравствуйте @qtL5Cr ,

    Коллекция представляет собой независимое хранилище данных для конкретного столбца, в котором содержатся элементы с id/value.
    Поэтому в массиве следует указать id и value и тогда всё сработает
    https://snippet.webix.com/92fcr2a5
    Как вариант, можно не использовать clearAll и parse, а сделать немного иначе:

     on:{
        onBeforeEditStart:function(id){ 
        if (id.column == "initial"){
          this.getColumnConfig(id.column).options = ["A", "B"];
        }
      }}
    

    Пример: https://snippet.webix.com/gl959ni7

  • Привет всем... вот этот пример идеально решает мою задачу
    https://snippet.webix.com/iz4jxejh

    нужно для каждой строки свой набор опций... Но есть один нюанс, фильтр работает как like т.е. Если мы фильтруем по группе <2> то в результат попадают элементы которые находится в группе 12 и 2 или 25, как сделать жесткий фильтр???

  • Уже нашел решение... сразу не понял...
    list.filter(function(itemObj){
    return true; //false;
    })
    т.е. в моем случае это выглядит так ...

    this.getEditor().getPopup().getList().filter(
    function(itemObj){
    if(itemObj.group == row['type']) return true;
    else return false;
    }
    ) ;
    :) может кто сразу тоже не доедет)))

  • Не могу добиться чтобы опции для richselect обновлялись сразу.
    Вот такая функция срабатывает на beforeeditstart, но с первого раза при клике на ячейку таблицы показывает пустой список. Если закрыть его и кликнуть второй раз - показывает заполненный список.

                onBeforeEditStart: function(itm, evt, wtvr){
                  if(itm["column"]=='flex_list'){
                    options = this.getColumnConfig(itm.column).collection
                    options.load('./pricing_lists_fx')
                  }
                }
    

    Пробовал заменять .load() на обертку из webix.ajax().get() и уже в then() обновлять коллекцию - результат тот же :(

  • попробуйте заполнить не collection, а непосредственно richselect.

    var editor = table.getEditor();
    if (editor) {
        editor.getPopup().getList().load('./pricing_lists_fx');
    }
    
  • Получилось, но не совсем.
    На этапе beforeeditstart редактора нет и table.getEditor() возвращает undefined.
    На этапе aftereditstart редактор уже есть - появляется пустой richselect на мгновение, и чувствуется задержка вызванная загрузкой. После загрузки он заполняется.

  • загрузка динамическая, поэтому задержка неизбежна.
    но если url статический, то надо просто указать options:'./pricing_lists_fx' в конфиге колонки.

  • Указал, не сильно помогло, но в целом полагаю сойдет и так.
    В любом случае мигает пустой список, поскольку перед загрузкой мне приходится его очищать: editor.getPopup().getList().clearAll(), иначе свежие варианты не подгружаются.

Sign In or Register to comment.