2011-12-28 17 views

Respuesta

3

¿Qué versión exacta de ExtJS4 usas?

En mi situación, con ext-4.0.7-gpl, depuré un poco al descubrir que el método appendChild crea un nodo y un objeto y luego realiza algunas operaciones de actualización relacionadas con la posición del nodo en el árbol, como establecer siguiente hermano, padre, etc., ver [1].

Al sincronizar, la tienda usa los métodos getUpdatedRecords y getNewRecords [2] para determinar qué operación ejecutar. actualizar o crear. De alguna manera, nuestros niños añadidos resultan ser actualizados, no creados.

Tenga en cuenta que el método no comprueba si se cargaron los elementos secundarios de un nodo principal, simplemente empuja el nuevo nodo en una matriz childNodes vacía; después de que todas estas operaciones finalizan, otros hijos de un nodo padre nunca se muestran en el árbol; y si la operación de actualización causó la generación de nuevos serverside id, el código se rompe en la línea original = me.tree.getNodeById(record.getId()); - no existe tal nodo con la edad id generada en el lado del cliente ..

En pocas palabras, creo que es un error.

[1] http://docs.sencha.com/ext-js/4-0/source/NodeInterface.html#Ext-data-NodeInterface-method-appendChild [2] http://docs.sencha.com/ext-js/4-0/source/AbstractStore.html#Ext-data-AbstractStore-method-getUpdatedRecords

Añadir: ExtJS 4.1 beta 2 no funciona mejor para mí

actualización con solución temporal: me corté un poco y creo que Resolvió el problema anulando el método appendChild de NodeInterface como a continuación (solo para establecer la propiedad phantom para que el registro se cree, no se actualice).

Tenga en cuenta: 1) Usted debe incluir su llamada appendChild en la devolución de llamada NodeInterfaceexpand método o el error con empujar al vacío childNodes permanecerá: el nuevo nodo aparecerá en algún lugar en el lugar equivocado; 2) Tuve que anular updateIndexes del AbstractView también, intente no hacer esto y tal vez descubra por qué; 3) hay algunos problemas cuando la tienda intenta eliminar nuestro nodo recién creado la próxima vez que se sincroniza; aún no puede rastrearlo; 0) soy ninguna manera ExtJS o incluso gurú JS, por lo que siento libre para corregir este hack)

Ext.data.NodeInterface.oldGpv = Ext.data.NodeInterface.getPrototypeBody; 
Ext.data.NodeInterface.getPrototypeBody = function(){ 
    var ret = Ext.data.NodeInterface.oldGpv.apply(this, arguments); 

    ret.appendChild = function(node, suppressEvents, suppressNodeUpdate) { 
     var me = this, 
     i, ln, 
     index, 
     oldParent, 
     ps; 


     if (Ext.isArray(node)) { 
      for (i = 0, ln = node.length; i < ln; i++) { 
       me.appendChild(node[i]); 
      } 
     } else { 
      node = me.createNode(node); 

      if (suppressEvents !== true && me.fireEvent("beforeappend", me, node) === false) { 
       return false; 
      } 

      index = me.childNodes.length; 
      oldParent = node.parentNode; 

      if (oldParent) { 
       if (suppressEvents !== true && node.fireEvent("beforemove", node, oldParent, me, index) === false) { 
        return false; 
       } 
       oldParent.removeChild(node, null, false, true); 
      }else{ 
       node.phantom = true; 
      } 

      if(me.isLoaded()){ 
       index = me.childNodes.length; 
       if (index === 0) { 
        me.setFirstChild(node); 
       } 

       me.childNodes.push(node); 
       node.parentNode = me; 
       node.nextSibling = null; 

       me.setLastChild(node); 

       ps = me.childNodes[index - 1]; 
       if (ps) { 
        node.previousSibling = ps; 
        ps.nextSibling = node; 
        ps.updateInfo(suppressNodeUpdate); 
       } else { 
        node.previousSibling = null; 
       } 
       node.updateInfo(suppressNodeUpdate); 
      } 

      //console.log('appendChild was called'); 

      // I don't know what this code mean even given the comment 
      // in ExtJS native source, commented out 

      // As soon as we append a child to this node, we are loaded 
      //if (!me.isLoaded()) { 
      // me.set('loaded', true); 
      //} 

      // If this node didnt have any childnodes before, update myself 
      //else 
      //if (me.childNodes.length === 1) { 
      // me.set('loaded', me.isLoaded()); 
      //} 

      if (suppressEvents !== true) { 
       me.fireEvent("append", me, node, index); 

       if (oldParent) { 
        node.fireEvent("move", node, oldParent, me, index); 
       } 
      } 

      return node; 
     } 
    }; 
    return ret; 
}; 

este es mi código para agregar un nodo por valores tomados de una forma domainForm. El formulario se abre haciendo clic en un icono en una actioncolumn de nuestra red de árboles:

var node = grid.store.getAt(rowIndex); 
node.expand(false, function(){ 
    var newDomain = domainForm.getValues(); 
    newDomain.parent = {id: node.raw.id}; // i don't know whether you'll need this 
    var newNode = node.appendChild(newDomain); 
    me.store.sync(); 
}); 

y updateIndexes overrider:

Ext.override(Ext.view.AbstractView, { 
    updateIndexes : function(startIndex, endIndex) { 
     var ns = this.all.elements, 
      records = this.store.getRange(), 
      i; 

     startIndex = startIndex || 0; 
     endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length < records.length?(ns.length - 1):records.length-1)); 
     for(i = startIndex; i <= endIndex; i++){ 
      ns[i].viewIndex = i; 
      ns[i].viewRecordId = records[i].internalId; 
      if (!ns[i].boundView) { 
       ns[i].boundView = this.id; 
      } 
     } 
    }  
}); 
1

tenían el mismo problema, una actualización de ext-4.1.0-beta-2 arreglado.

0

El motivo puede ser un formato de datos incorrecto que proviene del servidor en respuesta a su solicitud. Sincronización no ocurre. Pase la tecla 'éxito' con el valor TRUE en la respuesta del servidor.

0

Hmm ... probar este ...

beforeitemexpand(node, eOpts){ if (node.data.expanded) return false }

Cuestiones relacionadas