La funzione di knockout cleanNode()
sembra rimuovere le associazioni di eventi di jQuery sugli elementi all'interno del nodo. Come posso evitare questo?
Non c'è molta documentazione che ho trovato su cleanNode()
.Knockout cleanNode() rimuove i binding di eventi jQuery?
risposta
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.
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
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.
@ 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.
- 1. Riapplicare i binding in knockout
- 2. jQuery rimuove i listener di eventi dal contenuto DOM distrutto?
- 3. Modifica dell'ordine in cui vengono applicati i binding Knockout
- 4. Knockout 'for' binding?
- 5. Come rimuovere i binding dal nodo in knockout?
- 6. Knockout: impossibile elaborare il binding
- 7. Knockout Twitter Bootstrap Popover Binding
- 8. Binding Jquery Eventi On elementi generati attraverso altri eventi
- 9. Funzione di smistamento del handler di binding Knockout?
- 10. Knockout condivide un gestore di binding
- 11. Gestione binding personalizzata con Knockout e RequireJS
- 12. jQuery.off() non rimuove il binding
- 13. jQuery live() rimuove gli attributi degli eventi tattili di iPhone?
- 14. jquery html() rimuove i tag di script
- 15. Durandal/Knockout Template Binding Not Inserting
- 16. JavaScript rimuove i gestori di eventi degli elementi DOM cancellati?
- 17. Completamento automatico di Knockout e jQuery
- 18. I listener di eventi in jQuery vengono rimossi automaticamente quando si rimuove l'elemento utilizzando .html()?
- 19. listener di eventi nella finestra non rimuove
- 20. jQuery ::: rimuove veramente rimosso?
- 21. come chiamare la funzione di aggiornamento binding originale knockout
- 22. WPF e MVVM. Binding Eventi
- 23. gestore di eventi wpf binding in stile
- 24. jQuery rimuove una variabile URL
- 25. Binding stile knockout: firefox non imposta background-color?
- 26. jquery "questo" problema di binding sul gestore di eventi (equivalente di bindAsEventListener in prototipo)
- 27. knockout js: foreach binding aggiungendo un elemento statico
- 28. jQuery trim non rimuove ?
- 29. Knockout binding a più viste in una pagina con ID
- 30. knockout js 'con' binding, hide se array è vuoto
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
@prespic buona soluzione, ma ti suggerisco di scrivere la tua risposta, per renderla più visibile ai futuri utenti –