2011-10-20 4 views
66

W KnockoutJS tutorials natknąłem się na poniższy przykład kodu, który zawiera niewytłumaczalną zmienną $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> 

widoku modelu (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); 

Tutorial nie zawiera żadnego wyjaśnienia, co to znak dolara jest używany i gdzie to $data przychodzi od. Zmienna $data nie jest nigdzie zdefiniowana i po zmianie nazwy wszystkich trzech wystąpień z $data na $foobar ten przykład już nie działa.

Jakiego rodzaju magia się tutaj dzieje?

+2

wielkie pytanie. Walczyłem z tym. – DavidHyogo

Odpowiedz

37

Zmienna $data jest wbudowaną zmienną używaną do określenia bieżącego obiektu, który jest związany. W przykładzie jest to jeden z elementów w tablicy viewModel.folders.

+0

Dzięki za krótkie wyjaśnienie. Tak więc zmienna '$ data' istnieje tylko wtedy, gdy używane jest' foreach'? – dokaspar

+1

Możesz również podać jego wartość, używając parametru danych w deklaracji szablonu. Ponadto, jeśli ani parametr data lub foreach nie jest obecny, domyślnie jest to cały model widoku dla szablonu –

+3

Czy są jakieś inne wbudowane zmienne? – Nowaker

63

Dane $ są częścią Knockout's Binding Contexts.

Oto wszystkie wbudowanej zmienne:

  • $ rodzic
  • $ rodzice
  • $ korzeń
  • $ składnik
  • $ dane
  • $ index (dostępne tylko w wiązania foreach)
  • $ parentContext
  • $ rawData
  • $ componentTemplateNodes
+0

Dzięki za link. Nie znalazłem tego w nawigacji na stronie. – Aligned

+0

Bardzo przydatny link i lista – DavidHyogo

+0

To było bardzo pomocne! Dziękuję –

0

zrobiłem to działa

.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); 

proszę spojrzeć na http://jsfiddle.net/bowen31337/48RDd/

+2

To działało, nie było problemu. Rozwiązanie jest nawet dostępne na stronach samouczka. – dokaspar