Jstree выберите узел - PullRequest
       6

Jstree выберите узел

13 голосов
/ 20 апреля 2010

Привет, Я использую jsTree для генерации моих иерархических данных. JsTree генерируется следующим образом:

$(function() {
$("#industries").tree({
        data: {
            type: "json",
            opts: {
                url: "/Admin/GetIndustries/"
            }
        }
    });
});

это работает найти и jsonresult что-то вроде:

[{"attributes":[],"data":{"title":"Adwokaci, Notariusze","id":"1a051101-c3fa-48f2-b2e1-c60d1b67ea22"},"children":[{"attributes":[],"data":{"title":"Kancelarie adwokackie","id":"26d6cff1-3c7f-4a2f-bf5a-422e08127b43"

мой вопрос: как я могу сохранить идентификатор выбранного узла в каком-то скрытом поле? Я делаю что-то вроде этого:

<script type="text/javascript">
    $("#industries").click(function() {
        var tree = $.tree.reference("industries");
        var t = $.tree.focused(); if (t.selected) t.selected; else alert("Select a node first");
        alert(t.id);

    });

но это не работает. Я получаю в моем окне предупреждения "неопределенный". Может кто-нибудь, пожалуйста, помогите мне?

EDIT: Я изменил экземпляр jstree следующим образом:

$(function() {
$("#industries").tree({
        callback: {
            onselect: function(NODE, TREE_OBJ) {
                    alert(NODE.id);
                }
            },
        data: {
            type: "json",
            opts: {
                url: "/Admin/GetIndustries/"
            }
        }
    });
});

и я получаю пустое оповещение

Ответы [ 8 ]

17 голосов
/ 26 апреля 2011

Или просто привязать узел выбора:

$("#industries").tree({
        callback: {
            onselect: function(NODE, TREE_OBJ) {
                    alert(NODE.id);
                }
            },
        data: {
            type: "json",
            opts: {
                url: "/Admin/GetIndustries/"
            }
        }
    })
.bind("select_node.jstree", function (NODE, REF_NODE) {
            var a = $.jstree._focused().get_selected();
        }
    });

Попробуйте посмотреть переменную a для идентификатора или NODE. Я на самом деле использовал REF_NODE, чтобы получить

7 голосов
/ 25 августа 2011

Я не проверял все ответы, но увидел, что вы не выбрали ни одного, поэтому решил опубликовать метод, который работал для меня

 $(function () {
        $("#demo1")
        .bind("select_node.jstree", function (event, data) {
                           var selectedObj = data.rslt.obj;
            alert(selectedObj.attr("id") + selectedObj.attr("data"));
             })

это если вы хотите идентификатор и название узла. надеюсь, это поможет

1 голос
/ 09 ноября 2010

Вы можете использовать его в своей функции bind() следующим образом:

.bind("check_node.jstree", function(e, data) {
    //console.log(data.rslt.obj.attr(\'id\'));

    if (data.rslt.obj !== undefined && data.rslt.obj.attr(\'id\') !== undefined) {
        jQuery.ajax({
            async: false,
            type: "POST",
            dataType: "json",
            url: "' . Yii::app()->createUrl('adsmanager/adsfields/ajaxappendcategory') . '",
            data: {
                "id" : data.rslt.obj.attr(\'id\'),
                "itemId" : "' . Yii::app()->getRequest()->getParam('id') . '",
            },
            success: function(r) {
                if(r === undefined || r.status === undefined || !r.status) {
                    data.rslt.obj.removeClass(\'jstree-checked\');
                    data.rslt.obj.addClass(\'jstree-unchecked\');
                } else {
                    niceBox(\'ok, checked\');
                }
            }
        });
    }

    return true;
});

То же самое с отменой действия.

0 голосов
/ 20 июля 2017
$('#jstree-api').on('changed.jstree', function (e, data) {
    var objNode = data.instance.get_node(data.selected);
    var note;
    note = 'Selected Node Data(Id: <strong>' + objNode.id + '</strong>, Name: <strong>' + objNode.text + '</strong>)'; e = 'Selected Category(Id: <strong>' + objNode.id + '</strong>, Name: <strong id="api-data" data-parent="' + objNode.parent + '" data-id="' + objNode.id + '">' + objNode.text + '</strong>)';

    $('#footer-api').html(note);
});

Это даст вам информацию о выбранном узле.

Вот серия статей , которой вы должны следовать, если используете jsTree.

0 голосов
/ 21 мая 2010

Как и Мэтт, я также поместил id в объект атрибутов, чтобы он был присоединен к узлу li (пример скопирован из Matt).


{"data":"Origination",
 "attributes":{"id":"10"},
 "children":[
   { "data":"New Connection",
     "attributes":{"id":"11"}
   },
   { "data":"Disconnection",
     "attributes":{"id":"12"}
   }
 ]
}

Затем в своей функции onselect я сначала обертываю узел li в jQuery (параметр функции не переносится), затем получаю его идентификатор.


    treeObject.callback = {
        onselect: function(liNode, oTree) {
            var id = $(liNode).attr('id');
            var script = ComParentSet.getScript(id);
            script.doXYZ();
        }
    }
0 голосов
/ 19 мая 2010

Идентификаторы присваиваются любому из объектов HTML на данный момент?

В моем решении я установил идентификатор атрибута элемента, а не данных, который устанавливает идентификаторы для каждого

. Вот так:
[{"data":"Origination","attributes":{"id":"10"}",children":[
                     {"data":"New Connection","attributes":{"id":"11"}},
                     {"data":"Disconnection","attributes":{"id":"12"}},
                     {"data":"Load Change","attributes":{"id":"13"}},
                     {"data":"Corporate","attributes":{"id":"14"}}
                     ]}]

и это дает эффект рендеринга этого HTML-кода (я также использую плагин флажка jsTree):

<UL class=ltr sizcache="2" sizset="4">
  <LI id=10 class="  open" selected="false"><A class=undetermined href=""><INS>&nbsp;</INS>Origination</A>
  <UL sizcache="2" sizset="0">
    <LI id=11 class=leaf selected="false"><A href=""><INS>&nbsp;</INS>New Connection</A></LI>
    <LI id=12 class=leaf selected="true"><A class=checked href=""><INS>&nbsp;</INS>Disconnection</A></LI>
    <LI id=13 class=leaf selected="false"><A href=""><INS>&nbsp;</INS>Load Change</A></LI>
    <LI style="MARGIN-TOP: 0px" id=14 class="last leaf" selected="true"><A class=checked href=""><INS>&nbsp;</INS>Corporate</A></LI>
0 голосов
/ 04 мая 2010

Теперь, когда вы изменили свой код для использования обратного вызова onselect, у вас все еще есть проблемы? Я не могу сказать, означает ли ваше редактирование, что вы решили проблему или нет. Если да, отметьте этот вопрос как ответ.

Лично я использую onchange вместо onselect, но я уверен, что любой из них будет работать. Вы также можете рассмотреть возможность использования функций jquery data () для хранения значений вместе с элементом на странице вместо скрытого поля, если вы не хотите отправить форму со значением.

Но если вам нужно сохранить его в скрытом поле, попробуйте что-то вроде этого:

$("#industries").tree({
    //..... your other stuff .....
    callback: {
        onchange: function(NODE, TREE_OBJ) {
             $("#hidden_field").val(NODE.id);
        }
    }
});
0 голосов
/ 20 апреля 2010

Попробуйте обратные вызовы, упомянутые здесь: http://www.jstree.com/documentation

Это должно работать примерно так:

$("#industries").tree({
    //..... your other stuff .....
    callback: {
        onselect: function(NODE, TREE_OBJ) {
                      node_id = NODE.id;
                  }
    }
});
...