2012-08-08 13 views
25

Estoy muy confundido sobre cuál necesito usar para el objeto grep entre arriba() abajo() y Ext.getCmp (ID).arriba() y abajo() versus Ext.getCmp()

Para mí, es más fácil definir ID para objetar y recuperar el objeto por Ext.getCmp ('ID') y el código parece más limpio.

Por ejemplo:

console.log(this.up('panel').up('panel').down('grid')); 
console.log(Ext.getCmp('myPanel')); 

cuál es mejor para el rendimiento?

+0

getCmp es probablemente mejor para el rendimiento. Deberías usar UUID si vas a usar getCmp. El rendimiento no es todo. –

Respuesta

34

Hay errores graves con el uso de ID y getCmp para encontrar sus componentes. El problema principal es que no puede reutilizar el componente de forma segura porque en la mayoría de los casos el marcado creará elementos HTML con ID duplicados, que es HTML no válido. Además, cuando tiene dos componentes con el mismo ID, se encontrará con un comportamiento inesperado que es difícil de rastrear porque el marco no obtendrá una referencia correcta de sus componentes.

Hay varias publicaciones en el blog y en el foro al respecto, así como un video de J. Garcia sobre este tema. La forma sugerida de usar getCmp es solo para la depuración, cambiando a otros métodos (arriba, abajo, refs, itemId y ComponentQuery) para el código de producción lista.

+8

Puedo dar una vista contrastante: creo que poner las palabras 'reutilización de componentes' y 'dos ​​componentes con los mismos ID' junto a 'id' es impar; se ha gritado muchas veces que una identificación debe ser única. Soy una de las personas que se preocupa por el aspecto del DOM, por lo que hay muchos identificadores e Ítems para no obtener los identificadores generados automáticamente que ofrece ExtJS.Simplemente creo que el hecho de que uno use ExtJS no debería significar un DOM estilo gorila. – Izhaki

+2

Independientemente, dado que esta es la respuesta aceptada y para el beneficio de otros, creo que el título de la pregunta debería cambiar a algo así como 'Debería o no debería usar ID con ExtJS'. Tenía la impresión de que el rendimiento era la pregunta clave. – Izhaki

+1

Izhaki, estoy de acuerdo con su uso "judicial" de las identificaciones, según corresponda. Los uso yo mismo para el diseño central de los componentes de la ventana gráfica. Pero fíjate en la pregunta: demasiadas personas no entienden la implicación de usar las ID de los componentes y su impacto en el DOM y el comportamiento de la aplicación. – dbrin

15

Ext.getCmp() utiliza un mapa hash internamente, por lo que se ilumina rápido, casi tan rápido como recuperar el valor en una matriz basada en una clave.

.up() y down() se implementan mediante un recorrido de la jerarquía de componentes, que es un proceso más lento.

Pero up() y down() usan selectores, por lo que también pueden seleccionar clases, no solo identificadores.

Solo necesita recordar que hay varias situaciones en las que puede querer usar up() o down(), como cuando hay un controlador común para una multitud de controles, o cuando el componente que busca fue generado automáticamente por el marco así que no puedes darle una identificación tú mismo.

+0

He oído que no es una buena práctica usar getCmp porque si necesita acceder al objeto, debería poder agarrarlo fácilmente en el controlador. Me doy cuenta de que hay situaciones en las que esto simplemente no funciona, pero solo digo lo que he escuchado. – incutonez

+0

Bueno, es cierto que cuando se usa el framework MVC, es probable que veas menos 'Ext.getCmp()' y más uso de 'refs' y sus correspondientes getters. Pero diría que es más un negocio de diseño que nada. Otra ventaja de usar refs es que si cambia la identificación de un componente, solo necesita actualizarlo en los refs, donde con 'getCmp()' tendrá que hacer una búsqueda de reemplazo de base de código. – Izhaki

+0

Sí, esa es otra razón por la que escuché que usar el marco MVC es mejor. Quiero decir, tiene sentido usarlo si puedes, pero como dije, a veces tienes que usar getCmp. – incutonez

Cuestiones relacionadas