2011-10-20 4 views
66

KnockoutJS tutorials$data açıklanamaz bir değişken içeren aşağıdaki kod örneği üzerinde tökezledim.

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> 

Görünüm Modeli (JavaScript):

öğretici bu $data devreye girer dolar işareti kullanılır ve ne herhangi bir açıklama içermez
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); 

dan. $data değişkeni tanımlanmadı ve $data üç örneğinin tümünü $foobar olarak yeniden adlandırdığımda, örnek artık çalışmıyor.

Burada nasıl bir büyü var?

+2

Büyük soruya bir göz atın lütfen çalışması yaptı. Bununla uğraşıyordum. – DavidHyogo

cevap

37

$data değişkeni, bağlı olan geçerli nesneyi ifade etmek için kullanılan yerleşik bir değişkendir. Örnekte bu, viewModel.folders dizisindeki öğelerden biridir.

+0

Kısa bir açıklama için teşekkürler. Yani "$ data" değişkeni sadece "foreach" kullanıldığında var mı? – dokaspar

+1

Ayrıca, değerini şablon bildirgesindeki veri parametresini kullanarak da sağlayabilirsiniz. Ayrıca, ne veri veya foreach parametresi mevcut değilse, varsayılan olarak şablon için tüm görünüm modeline varsayılan –

+3

Başka yerleşik değişkenler var mı? – Nowaker

63

$ data, Knockout's Binding Contexts'un bir parçasıdır. içinde

  • $ ebeveyn
  • $ veliler
  • $ kök
  • $ bileşeni
  • $ veri
  • $ indeksi (yalnızca: Burada

    tüm yerleşik değişkenlerdir foreach bağlamaları)

  • $ parentContext
  • $ rawData
  • $ componentTemplateNodes
+0

'un bağlantı için teşekkürler. Sitede navigasyonda bulamadım. – Aligned

+0

Çok kullanışlı link ve liste – DavidHyogo

+0

Bu çok yardımcı oldu! Teşekkür ederim –

0

ben

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

http://jsfiddle.net/bowen31337/48RDd/

+2

Çalışmak sorun değildi. Eğitim sayfalarında bir çözüm bile mevcuttur. – dokaspar