2012-02-16 10 views
11

Con Knockout 2.0 utilizzando questa scheda si legano:Eliminare i parametri 2.0 dal binding nell'ordine errato?

data-bind="click: $root.deleteSomeEntity.bind($data, $parent)" 

nel Knockout ViewModel JavaScript il primo argomento in

self.deleteSomeEntity = function (data, parent) { 
    // perform deletion 
} 

sembra essere il genitore piuttosto che i dati.

C'è un motivo per questo comportamento o qualcosa che mi manca?

risposta

12

Quando si chiama bind il primo parametro sarà il valore di this. Quindi, nella tua chiamata this sarà $data e il primo argomento sarà $parent.

Se $root è $parent in questo caso, quindi appena si può fare:

$root.deleteSomeEntity.bind($root)

KO passerà i dati come primo parametro e this verrà impostato su $root.

Se $parent non è $root (e probabilmente non si vuole fare affidamento su this essere un oggetto diverso che $root nel vostro metodo su root), allora si potrebbe fare qualcosa di simile:

$root.deleteSomeEntity.bind($root, $data, $parent)

Altrimenti, ci sono sicuramente dei modi per assicurarti di avere il corretto this all'interno del tuo modello di visualizzazione. Dipende comunque dalla tua struttura.

+0

seguito i vostri suggerimenti: http://jsfiddle.net/6MmWs/5/ tuttavia quando facendo clic su Elimina e sulla funzione 'self.deleteContactPhone = (viewModel, telefono, contatto)' viewModel è un telefono, il telefono è un contatto e il contatto è anche un telefono. 'this' è attualmente il viewmodel. – kendaleiv

+1

Lo vorrai più simile a http://jsfiddle.net/rniemeyer/6MmWs/6/. Un paio di cose da menzionare. 'remove' è una funzione disponibile su un ObservableArray. Ho commutato i tuoi array 'phones' affinché fossero osservabili, in modo da avere' remove' e gli aggiornamenti dell'interfaccia utente quando ne viene rimosso uno. –

+0

L'altra cosa è che vuoi che la tua firma della funzione sia semplicemente 'funzione (telefono, contatto)'. Il primo parametro di 'bind' è il target, che viene utilizzato per controllare il valore di' this' quando la funzione viene eseguita. Quindi, non è in realtà un argomento per la funzione. –

2

Perché stai usando bind()? Per impostazione predefinita, se scrivi semplicemente il nome della funzione javascript come evento click, il passaggio Knockout passerà a $data come primo argomento e l'evento come secondo.

http://knockoutjs.com/documentation/click-binding.html (Nota 1 & 2)

Perché perdere tempo con bind() quando si può semplicemente fare questo:

data-bind="click: function() {$root.deleteSomeEntity($data, $parent)}" 
+0

Questo codice sembra essere eseguito senza fare clic per me. È all'interno di un data-bind = "foreach: ..." se questo cambia qualcosa. – kendaleiv

+0

Oh certo che lo è! Scusa, ho modificato il codice in modo che 'function()' sia racchiuso tra i collegamenti dei clic. Questo dovrebbe funzionare come previsto ora. – soniiic

+1

È solo una cosa di stile. A molte persone non piace mettere le funzioni anonime nel loro markup. Questa è una delle cose che spegne le persone quando iniziano a KO, specialmente quando sono abituate ad un approccio più discreto. Funziona in entrambi i modi, anche se preferisco assicurarmi che 'this' sia impostato correttamente nel modello di visualizzazione stesso. –

Problemi correlati