2013-08-09 2 views
15

Ho una situazione in cui mi piacerebbe avvisare un nonno o $ genitori [1] di un evento click che si verifica in un submodelmodello. Quindi, in pratica mi piacerebbe essere in grado di fare questo

self.$parents[1].actionTaken 

Credo che questo non funziona a causa del legame contesto vs ViewModel, ma mi piacerebbe sapere se qualcuno ha un idee sul modo corretto di fare qualcosa come questo. Grazie

self.save = function() { 

    //do stuff to self first, then 

     self.$parents[1].actionTaken(); 

}; 

risposta

17

In alternativa, è possibile passare parametri al gestore di eventi del modello di visualizzazione nel seguente modo: Modifica il tuo metodo save

self.save = function(theParents) { 
    theParents[1].actionTaken(); 
} 

e vincolare il proprio gestore seguente modo:

data-bind="click: function() { $data.save($parents) }" 

Per ulteriori informazioni, si prega di fare riferimento a Note 2 in the click handler's documentation (è necessario Scoll giù un po ')

3

In realtà, le azioni sono definiti nel ViewModel nel mondo knockoutjs'. E i $ parents/$ data sono 'context'. Creo una struttura dati per dimostrare la tua necessità. Azienda reparto>vendite>dipendenti

Si possono trovare in questo esempio jsfiddle: invoke root action in child event

Se si desidera continuare a fare questo in qualche ragione, si può anche definire il ActionTaken () Funzione nel contesto dei nonni (non come metodo viewmodel). Ma potrebbe non essere un modo usuale. Qualunque cosa, check this out:

self.company={name:'ABC', click:function(){self.onCompClicked();}, salesDepartment:{manager:'Mgr',employees:['Smith','John']}}; 

quindi modificare l'evento di legame click a questo:

data-bind="text: $data, click: $parents[1].click" 

Il codice aggiornato della 2 ° edizione è qui: invoke context action in child event

15

Oppure utilizzare il bind trucco

data-bind="click: $parent.foo.bind($parent)" 

Ora quando si accede alla funzione foo, la parola chiave this punterà al contesto genitore.

foo: function(child) { 
    this.children.remove(child); 
} 
+2

Legge e funziona meglio (per me) della risposta accettata. –

4

Al giorno d'oggi (con eliminazione diretta 3.0.0) si può solo aggiungere due parametri alla funzione bambino (eseguita dal legame click), il primo sarà assegnato il ViewModel attuale e la seconda sarà assegnato il fare clic sugli eventi.

Quindi chiamare ko.contextFor() e passare il target dell'evento e si avrà accesso a $ parent tramite l'oggetto contesto.

this.myChildFunction = function (vm, e) { 
    var context = ko.contextFor(e.target); 
    context.$parent.myParentFunction(); 
}; 

(non so se questo è stato possibile durante il tempo delle altre risposte ...)