2012-05-15 16 views
9

Quindi ho un problema davvero strano con un binding di click di knockoutjs che non viene allegato ai tag di ancoraggio. Altri dati-bind = "" funziona ma non l'associazione dei clic.knockoutjs collegamento di clic non funziona in foreach nidificato

qui sotto potete vedere il codice HTML e parte del ViewModel js file di

var tag = function (data) { 
    this.count = data.Count; 
    this.id = data.Id; 
    this.title = data.Title; 
    this.tagGroup = data.TagGroup; 
}; 
var tagContainer = function (data) { 
    this.tagList = $.map(data.Tags, function (item) { return new tag(item); }); 
    this.letter = ko.observable(data.Letter); 
}; 

var searchViewModel = function(){ 
    var self = this; 

    self.tagContainerList = ko.observableArray([]); 

    self.addFilter = function (tag) { 
    //move tag to active filters and do some more cool stuff here 
    }; 


}; 

<div id="modal-all-tags" data-bind="with:searchViewModel"> 
    <ul data-bind="foreach:tagContainerList"> 
     <li> 
      <span data-bind="text:$data.letter()"></span> 
      <ul data-bind="foreach:tagList"> 
       <li><a href="#" data-bind="click:$root.addFilter"><span data-bind="text:title"></span></a></li> 

      </ul> 
     </li> 
    </ul> 

     <a class="close-reveal-modal">&#215;</a> 
</div> 

Fondamentalmente si tratta di un popup modale e la sua carica quando l'utente fa clic su un link nella pagina. mando una richiesta al server e mi restituisce un elenco di contenitori Tag ogni hanno la lettera iniziale e un elenco di tag da rendere al di sotto della lettera come questa: Un una parola 1 una parola 2 B b parola 1 b parola 2 C c parola 1 c parola 2

e così via ...

le lettere sono visualizzate correttamente A, B, C e ciascuno ottiene la lista dei tag corretto reso sotto di loro con testo: titolo visualizzato correttamente.

Tutto funziona tranne addFilter(); funzione che voglio associare ad ogni link nella lista dei tag. Il browser salta e aggiunge un carattere hash all'URL. Firebug non mostra alcun errore sui binding.

Il motivo per cui il contenitore div ha un: searchViewModel è perché esiste un modello di visualizzazione principale per l'intera pagina. Ma questo non dovrebbe importare dal momento che sta lavorando su ogni altra pagina del progetto.

L'unica cosa che posso pensare è che l'associazione di clic $ root.addFilter è errata ma ho provato solo addFilter dove firebug restituisce l'errore "addFilter non è definito;"

E ho provato entrambi $ parent e $ root.

Qualcuno ha qualche suggerimento?

+3

Spiegheresti come lo hai risolto, lo apprezzerei molto. –

risposta

15

Un pensiero che ho avuto. La funzione addFilter si aspetta un parametro (tag) ma non si è passarlo nulla nel legame:

<a href="#" data-bind="click:$root.addFilter"> 

Potrebbe essere questo il problema?

Forse qualcosa sulla falsariga di:

<a href="#" data-bind="click:function() { $root.addFilter($data) }"> 

aiuterebbe?

+1

Purtroppo non funziona ottenendo $ parent.addFilter non è una funzione provata con $ root aswell. Ma mi ha dato un'idea, proverò alcune cose con questo approccio. – Kimpo

+0

Ancora senza fortuna, sto usando il click: addFilter in altre parti della pagina dove è possibile aggiungere filtri di ricerca e $ i dati di solito non sono necessari se si sta chiamando ad esempio una funzione quando si scorre attraverso un array osservabile – Kimpo

+0

Mi dispiace sentire quella. Tu dici che "Firebug non mostra alcun errore sui binding."Questo implicherebbe che la funzione addFilter venga chiamata altrimenti verrebbe generato un errore. Hai provato a inserire un punto di interruzione nella funzione addFilter (trovo che Chrome sia ottimo per il debug di knockout) e vedere se il problema si trova all'interno della funzione? controlla cosa viene passato nel parametro tag e vedi se questo è il problema –

3

Mi sono imbattuto in qualcosa di simile e all'inizio ho eseguito data-bind="click:function() { console.log($parents) }". Si noti che il suo $parents non è $parent. Ho cercato di trovare il contesto, e quello di cui avevo bisogno sembrava qualcosa di simile data-bind="click:$parents[1].onCardClick"

+0

Xerri mi ha offerto una soluzione molto valida, sono rimasto bloccato esattamente nella stessa situazione e ha risolto il mio problema. solo il cambiamento che ho fatto è stato mettere le parentesi data-bind = "click: $ parents [1] .onCardClick() e ha funzionato come charm. –

Problemi correlati