2012-07-26 12 views
10

Ecco un jsfiddle per mostrare qual è il problema:Firing evento di modifica quando la proprietà vista knockout modello viene aggiornato

http://jsfiddle.net/boblauer/BgvV4/

Sto cercando di generare l'evento cambiamento dopo un campo di testo viene aggiornato. Sfortunatamente, all'interno del metodo subscribe, il valore della casella di testo non è stato ancora aggiornato, quindi quando indago l'evento change, viene attivato troppo presto.

Devo attivare l'evento di modifica perché ho un codice di terze parti fuori dal mio controllo che si basa sull'evento di modifica.

Qualche suggerimento?

+0

L'evento di modifica viene impostato nel codice di terze parti o è sufficiente chiamarlo? – Tyrsius

+0

Il gestore eventi change è associato al codice di terze parti e devo attivarlo quando il mio modello di visualizzazione aggiorna il valore della mia casella di testo. –

+0

Forse non ti sto seguendo. Se si desidera intercettare il nuovo valore (quello in cui è stato modificato), il metodo di iscrizione è valido e nel proprio esempio funziona. Dato che mi manca qualcosa, quali sono i risultati attesi? –

risposta

7

Una soluzione semplice consiste nel trasferire la chiamata a $ ("# testo1"). Change() in un setTimeout con un timeout pari a 0. È sufficiente lasciare che knockout esegua l'aggiornamento (sincrono) al valore della casella di testo prima del viene richiamato il gestore di modifiche jquery.

ho biforcuta vostro violino per dimostrare: http://jsfiddle.net/SuRYa/1//

Se questo è qualcosa che devi fare un sacco, una soluzione migliore è probabilmente quello di avvolgere questo comportamento in un costume di legame in cui la richiamata "aggiornamento" del legame licenzierebbe l'evento di cambio jquery sull'elemento aggiornato.

+0

Non è una soluzione ideale, ma non sono convinto che esista una soluzione ideale, quindi penso che questa potrebbe essere la mia migliore opzione. Grazie per il suggerimento. –

0

bmode è giusto, un binding personalizzato lo farà. Anche se questa risposta è un po 'tardiva, ecco l'associazione nel caso in cui aiuti qualcuno a leggere successivamente questo post. Aggiorna il valore della casella di testo usando jQuery - il DOM è ora aggiornato in modo che il codice di terze parti di Bob funzioni, quindi attiva l'evento di modifica.

ko.bindingHandlers.valueAndFireChange = { 
    update: function(element, valueAccessor) { 
     var val = ko.unwrap(valueAccessor()); 
     if (val == undefined) return; 
     $(element).val(val); 
     $(element).change(); 
    } 
}; 

Ecco una versione aggiornata del violino di Bob che mostra in azione:

http://jsfiddle.net/BgvV4/17/

ho cambiato l'avvisi console.log, quindi avrai bisogno di console aperto per vedere le info utili .

Problemi correlati