2011-10-20 3 views
66

Nel KnockoutJS tutorials mi sono imbattuto nel seguente esempio di codice che contiene una variabile inspiegabile $data.

The View (html):

<!-- Folders --> 
<ul class="folders" data-bind="template: { name: 'folderTemplate', foreach: folders }"></ul> 
<script type="text/html" id="folderTemplate"> 
    <li data-bind="css: { selected: $data == mailViewModel.selectedFolder() }, 
        click: function() { mailViewModel.selectFolder($data) }"> 
     ${$data} 
    </li>  
</script> 

la vista del modello (JavaScript):

var viewModel = { 
    // Data 
    folders: ['Inbox', 'Archive', 'Sent', 'Spam'], 
    selectedFolder: ko.observable('Inbox'), 

    // Behaviours 
    selectFolder: function (folder) { 
     this.selectedFolder(folder); 
    }  
}; 

window.mailViewModel = viewModel; 
ko.applyBindings(viewModel); 

Il tutorial non contiene alcuna spiegazione ciò che il simbolo del dollaro è usato per e dove questo $data viene a partire dal. La variabile $data non è definita da nessuna parte e quando rinominerò tutte e tre le istanze di $data in $foobar, l'esempio non funziona più.

Che tipo di magia sta succedendo qui?

+2

grande domanda. Stavo lottando con questo. – DavidHyogo

risposta

37

La variabile $data è una variabile incorporata utilizzata per fare riferimento all'oggetto corrente associato. Nell'esempio questo è uno degli elementi nell'array viewModel.folders.

+0

Grazie per la tua breve spiegazione. Quindi la variabile '$ data' esiste solo quando viene utilizzato un' foreach'? – dokaspar

+1

È inoltre possibile fornire il suo valore utilizzando il parametro data nella dichiarazione modello. Inoltre, se non sono presenti né i dati né il parametro foreach, per impostazione predefinita utilizza l'intero modello di vista per il modello. –

+3

Esistono altre variabili predefinite? – Nowaker

63

$ data fa parte di Knockout's Binding Contexts.

Ecco tutte le variabili built-in:

  • $ genitore
  • $ genitori
  • $ radice
  • $ componente
  • $ dati
  • $ index (disponibile solo all'interno foreach binding)
  • $ parentContext
  • $ rawData
  • $ componentTemplateNodes
+0

Grazie per il link. Non l'ho trovato nella navigazione sul sito. – Aligned

+0

Link e lista molto utili – DavidHyogo

+0

Questo è stato molto utile! Grazie –

0

mi ha reso il lavoro

.selected { 
    color:red; 
} 

<ul class="folders" data-bind="template: { name: 'folderTemplate', foreach: folders }"></ul> 
<script type="text/html" id="folderTemplate"> 
    <li data-bind="css: { selected: $data == mailViewModel.selectedFolder() },text:$data, 
        click: function() { mailViewModel.selectFolder($data) }"> 
    </li>  
</script> 

var viewModel = { 
    // Data 
    folders: ['Inbox', 'Archive', 'Sent', 'Spam'], 
    selectedFolder: ko.observable('Inbox'), 

    // Behaviours 
    selectFolder: function (folder) { 
     this.selectedFolder(folder); 
    }  
}; 

window.mailViewModel = viewModel; 
ko.applyBindings(viewModel); 

si prega di dare un'occhiata a http://jsfiddle.net/bowen31337/48RDd/

+2

Rendendolo funzionare non era il problema. Una soluzione è disponibile anche nelle pagine del tutorial. – dokaspar