TypeEerror Quando si eseguono specifiche Jasmine che utilizzano un plug -in jQuery costruito utilizzando la fabbrica di widget

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

Domanda

Sto usando un plugin jQuery chiamato aterrotto per l'editing in linea.

Tutto funziona bene quando il codice viene effettivamente utilizzato nella pagina.

Tuttavia, la mia suite di test fallisce con il seguente errore:

TypeError: Cannot call method 'remove' of undefined

L'ho rintracciato per essere attivato dall'interno del clear metodo di questo particolare plugin. È possibile trovare il suo file di origine qui.

Ci sono due bit pertinenti in quel codice:

1- il _init funzione

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

Come puoi vedere, quando il plugin viene istanziato, utilizza il data struttura su self per archiviare l'elemento appena creato.

2- il clear funzione

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

Il clear La funzione quindi cerca di accedere a quella struttura e recuperare l'elemento. Questo è quando, mentre all'interno di una specifica del gelsomino, non riesce con la suddetta eccezione.

Qualcuno ha visto qualcosa di simile?

MODIFICARE:

Questa è la mia specifica, è il codice più semplice in grado di riprodurre l'errore:

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

È stato utile?

Soluzione 2

Ho trovato il mio problema: vecchia versione del duo JQuery + JQuery UI. Aggiornare loro risolve l'eccezione.

Altri suggerimenti

Stavo dando un'occhiata alla fonte di ToggleEdit e sembra che le uniche 2 volte la funzione Clear sia chiamata appena prima di autoelement.data viene impostata:

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

E alla funzione di distruzione:

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

Dal momento che la prima chiamata sembra essere protetta, ti faccio una domanda un po 'stupida: è possibile che Destrow venga chiamato due volte?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top