Tengo una aplicación de diario en la que tengo un árbol elegante que muestra las entradas del diario del usuario que inició sesión. Debajo de ese árbol, tengo otro árbol elegante con un menú desplegable encima que le permite seleccionar a otros usuarios y explorar sus entradas del diario. Una vez que selecciona un usuario, toma su ID de usuario y luego carga el segundo árbol con sus entradas. Esto funciona muy bien hasta aproximadamente la séptima selección, en la que el árbol se cuelga y básicamente mata mi sesión de Tomcat. Tengo que reiniciar Tomcat para solucionarlo.

Mi HTML es:

<div class="journalList left-column">
  <div id="logTree"></div>

  <div class="browser">
    <div class="userWrapper">
      <h4>Browse Other User Logs</h4>
      <select id="otherUser">
      </select>
    </div>
    <div id="browseTree"></div>
  </div>
</div>

El árbol de registro de ID es el árbol elegante para el usuario que está conectado. El árbol de navegación es para el usuario seleccionado.

Código relevante en JavaScript para #logTree.

$('#logTree').fancytree({
    source: {
        type: 'post',
        cache: false,
        url: "/LogbookServlet",
        data: {action:"init", sub:"logtree"},
        datatype: 'json'
    },
    lazyLoad: function(event, data) {
        var node = data.node;
        data.result = getLogTreeData(node.key);
    },
    loadChildren: function(event, data) {
        var node = data.node;
        var activeNode = $("#logTree").fancytree("getActiveNode");
        if (activeNode) {
            activeNode.setExpanded(true);
            var mon = new Date().getMonth();
            var curMonth = months[mon];
            var children = activeNode.getChildren();
            if (children) {
                for (var i = 0; i < children.length; i++) {
                    var childNode = children[i];
                    var title = childNode.title;
                    if (title == curMonth) {
                        $("#logTree")
                        .fancytree("getTree")
                        .activateKey(childNode.key);
                     }
                }
            }
        }
    }
});

Esta sección de código se llama cuando la página se carga por primera vez:

var otherUsrId;
$('#browseTree').fancytree({
    source: [],
    lazyLoad: function(event, data) {
        var node = data.node;
        data.result = getLogTreeData(node.key, otherUsrId);
    },
    loadChildren: function(event, data) {
        var node = data.node;
    }
});

Tengo un controlador para el Select para detectar el cambio de usuarios:

$('#otherUser').on('change select', function() {
    // Get the User ID from the Select
    otherUsrId = $(this).val();
    getUserTree(otherUsrId);
});

Y aquí está el código para getUserTree ():

function getUserTree(otherUsrId) {
    var userTree = $('#browseTree').fancytree("getTree");
    userTree.reload({
        url: "/LogbookServlet",
        data: {action:"init", sub:"logtree", otherUsrId:otherUsrId},
        datatype: 'json'
    });
}

Entonces, después de seleccionar un usuario por séptima vez, el árbol de fantasía "BrowseTree" simplemente se cuelga con el ícono de carga girando y mata mi navegador. ¿Algunas ideas? Parece que tal vez algo se llama de forma demasiado recursiva. No estoy seguro.

2
G.Price 16 oct. 2018 a las 19:52

2 respuestas

La mejor respuesta

Entonces, resolví mi problema ... Resulta que estaba haciendo una llamada recursiva a una función llamada getChildren () en el lado del servidor. Como estoy usando la carga diferida en todo el segundo árbol, no necesitaba llamar a esto.

1
G.Price 23 oct. 2018 a las 13:46

No estoy totalmente seguro de que ayude, pero noté algo crítico. Intente agregar esto antes de crear el árbol:

$(":ui-fancytree").fancytree("destroy");

Este destroy faltante me ha causado (a veces) problemas al recargar, así que espero que también solucione el problema ;-)

0
MBaas 22 oct. 2018 a las 14:57