TypeError Al ejecutar especificaciones de jazmín que usan un complemento jQuery construido con la fábrica de widgets

StackOverflow https://stackoverflow.com/questions/8399427

Pregunta

Estoy usando un complemento jQuery llamado toggleEdit para edición en línea.

Todo funciona bien cuando el código se usa realmente en la página.

Sin embargo, mi suite de prueba falla con el siguiente error:

TypeError: Cannot call method 'remove' of undefined

Lo rastreé para ser activado desde el interior del clear Método de este complemento en particular. Su archivo fuente se puede encontrar aquí.

Hay dos bits relevantes en ese código:

1- el _init función

self.element.addClass("toggleEdit toggleEdit-edit toggleEdit-edit-" +   
self._tag(self.element))
//store reference to preview element
.data("toggleEdit-preview", self.p);

Como puede ver, cuando el complemento se instancia primero usa el data estructura sobre self Para almacenar el elemento recién creado.

2- el clear función

self.element.data("toggleEdit-preview").remove();

los clear La función luego intenta acceder a esa estructura y recuperar el elemento. Fue entonces cuando, mientras está dentro de una especificación de jazmín, falla con la excepción antes mencionada.

¿Alguien ha visto algo similar?

EDITAR:

Esta es mi especificación, es la pieza de código más simple capaz de reproducir el error:

it("should update the given attribute on the server", function(){
  $('#user-details input, #user-details select').toggleEdit(); //this line triggers the error
});

http://alz.so/static/plugins/toggleedit/jquery.toggleedit.js

¿Fue útil?

Solución 2

Encontré mi problema: versión antigua del duo JQuery + jQuery UI. Actualizarlos resuelve la excepción.

Otros consejos

Estaba echando un vistazo a la fuente de ToggleEdit y parece que las únicas 2 veces que la función se llama es justo antes de self.element.data se establece:

if (typeof self.element.data("toggleEdit-preview") !== "undefined") {
     self.clear();
     self.disableEvents();
}

Y en la función de destrucción:

destroy: function() {
         var self = this;
         self.clear();
         self.disableEvents();
         $.Widget.prototype.destroy.apply(self, arguments);
       }    

Dado que la primera llamada parece estar protegida, le hago una pregunta algo tonta: ¿es posible que la destrucción se llame dos veces?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top