集成jstree和select2

时间:2015-12-03 11:42:44

标签: jquery jquery-select2 jstree jquery-select2-4

在我的页面中,我使用了jstreeselect2。我想将两个插件集成在一起。有什么办法吗?我的代码看起来很简单,因为它只依赖于插件集成的领域,它看起来像:

var dataSelect = [
    {
        id: 1,
        text: "test"
    },
    {
        id: 2,
        text: "test2"
    },
    {
        id: 3, text: "test3"
    }
];

var dataTree = [
    {
        id: 1, text: "test"
    },
    {
        id: 3,
        text: "test3"
    }
];

    $('#jstree').jstree({
    'core': {
        'data': dataTree,
        "themes": {
            "icons": false
        }
    },
    "checkbox": {
        "keep_selected_style": false,
        "three_state": true
    },
    "plugins": ["checkbox", "state"]
});

$("#selectSample").select2({
    data: dataSelect,
    multiple: true
});

JSFIDDLE

如您所见,两种情况下的数据都具有类似的ID。如果我点击树中的test,那么我希望select设置为"test"。有没有解决这个问题的方法?

修改

@Nikolay Ermakov的回答让我纠正了思考,但问题是当我用ajax加载select时。当我点击jstree中的某个选项时,数据将被销毁,我无法在select中选择任何内容。此外,select2上未选择任何选项。

EDIT2

当我点击jstree中的某个选项时,系统会删除所有选项,并向select输入一个空白值,可以选择该值。

3 个答案:

答案 0 :(得分:2)

我想我已经双向进行了互动。请检查这个小提琴:JS Fiddle

我使用了select {2}的jsTree和changed事件的select/unselect事件。

以下是代码的外观:

var dataSelect = [{id: "1", text: "test"},{id:"2", text: "test2"},{id:"3", text: "test3"}];
var dataTree = [{id: "1", text: "test"},{id:"3", text: "test3"}];


$("#selectSample").select2({data:dataSelect, multiple: true});

$('#jstree')
    .on('changed.jstree', function (event, data) {
        var $select = $("#selectSample").select2(),
            selectedOptions = $select.val() || [],
            optionId = data.node.id;

        if( data.action == 'select_node'){ 
          selectedOptions.push( optionId );
          $select.val(selectedOptions).trigger("change");
        }

        if( data.action == 'deselect_node'){ 
          selectedOptions.splice( selectedOptions.indexOf( optionId ), 1 );
          $select.val(selectedOptions).trigger("change");
        }

    })
    .jstree({
        'core': {
          'data': dataTree,
          "themes":{
            "icons":false
          }
        },
        "checkbox": {
          "keep_selected_style": false,
          "three_state": true
        },
        "plugins" : [ "checkbox" ]
    });

$("#selectSample")
    .on('select2:select', function(event) {
      $('#jstree').jstree('select_node', '#'+event.params.data.id, true);
    })
    .on('select2:unselect', function(event) {
      $('#jstree').jstree('deselect_node', '#'+event.params.data.id, true);
    });

答案 1 :(得分:0)

这样的工作 -

var dataSelect = [{id: 1, text: "test"},{id:2, text: "test2"},{id:3, text: "test3"}];
var dataTree = [{id:1, text: "test"},{id:3, text: "test3"}];

$('#jstree').jstree({
        'core': {
            'data': dataTree,
            "themes":{
            "icons":false
        }
        },
            "checkbox": {
            "keep_selected_style": false,
            "three_state": true
        },
            "plugins" : [ "checkbox","state" ]
    })
.on("select_node.jstree", function(a,b){
  $("#selectSample").append('<option value="' + b.node.original.text + '">' + b.node.original.text + '</option>');
  var selectedValues = $("#selectSample").val();
  if (selectedValues == null) {
        selectedValues = new Array();
     }
  selectedValues.push(b.node.original.text);
  $("#selectSample").val(selectedValues).trigger('change');
});

$("#selectSample").select2({data:dataSelect, multiple: true});

答案 2 :(得分:0)

嗯,我解决了我的问题! :)我使用@Nikolay Ermakov发送的解决方案。但是,我发起选择有点不对劲。使用$ .ajax()读取一个参数,我稍后将其提供给我的选择。所以生成的代码工作正常! :)谢谢大家的承诺! :)