2013-05-10 19 views

risposta

0

Il modo migliore per gestire questo è quello di mantenere il codice di binding jQuery separato dalle associazioni di knockout. In questo modo, puoi semplicemente chiamare la funzione per ripristinare i collegamenti jQuery. Sfortunatamente, potrebbe essere necessario un codice refactor del codice esistente per farlo.

0

cleanNode non accetta alcun parametro che consenta di impedire questo comportamento. Penso che la tua migliore opzione sarebbe quella di creare il tuo metodo basato sulla funzione Knockout ma senza la pulizia di jQuery. Senza aver costruito un'applicazione di esempio per verificare, vorrei cercare di creare una funzione che è identico a cleanSingleNode (nodo) e rimuovere questa riga:

if ((typeof jQuery == "function") && (typeof jQuery['cleanData'] == "function")) 
     jQuery['cleanData']([node]); 

È possibile controllare la fonte di debug qui per maggiori informazioni su altri interno correlato funzioni: http://knockoutjs.com/downloads/knockout-2.2.1.debug.js

5

Direttamente dal knockout docs:

"Override clean-up dei dati esterni

Quando si rimuove un elemento, Knockout corre logica per pulire eventuali dati associati all'elemento Come. parte di questa logica, Knockout chiama il metodo cleanData di jQuery se jQuery è caricato nella tua pagina. In scenari avanzati, potresti voler impedire o personalizzare il modo in cui questi dati vengono rimossi nella tua applicazione.Klockout espone una funzione, ko.utils.domNodeDisposal.cleanExternalData (nodo), che può essere overr pensato per supportare la logica personalizzata. Ad esempio, per evitare che cleanData di essere chiamato, una funzione di vuoto potrebbe essere utilizzato per sostituire l'implementazione cleanExternalData di serie:."

ko.utils.domNodeDisposal.cleanExternalData = function() { 
    // Do nothing. Now any jQuery data associated with elements will 
    // not be cleaned up when the elements are removed from the DOM. 
}; 

Ultimamente sono impazzito a causa di sessioni di debug infinite

ho visto questa domanda , e spero che la mia risposta dà una soluzione più immediata per coloro che sono ancora alla ricerca.

+1

Questo metodo funziona correttamente, quindi ho scritto una breve funzione che sovrascrive il metodo cleanExternalData, chiama clearNode e ripristina il metodo originale. 'private koClearNode (elemento: HTMLElement) { var original = ko.utils.domNodeDisposal ['cleanExternalData']; ko.utils.domNodeDisposal ['cleanExternalData'] = function() {}; ko.cleanNode (elemento); ko.utils.domNodeDisposal ['cleanExternalData'] = originale; } ' Funziona anche in TypeScript, dove cleanExternalData non è in digitazione. – prespic

+1

@prespic buona soluzione, ma ti suggerisco di scrivere la tua risposta, per renderla più visibile ai futuri utenti –

4

@ T-moty risposta sta lavorando bene, così ho scritto una breve funzione che l'override del metodo cleanExternalData, chiamare clearNode e impostare originale metodo bac K.

private koClearNode(element: HTMLElement) 
    { 
     var original = ko.utils.domNodeDisposal['cleanExternalData']; 
     ko.utils.domNodeDisposal['cleanExternalData'] = function() { }; 
     ko.cleanNode(element); 
     ko.utils.domNodeDisposal['cleanExternalData'] = original; 
    } 

Funziona anche in TypeScript, dove cleanExternalData non è in digitazione.

Problemi correlati