2011-10-20 25 views
66

Trong KnockoutJS tutorials Tôi tình cờ gặp ví dụ mã sau có chứa biến không thể giải thích $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> 

The View Model (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); 

Các hướng dẫn không chứa bất kỳ lời giải thích những gì mà ký hiệu đô la được sử dụng cho và nơi $data này do thỏa thuận từ. Biến số $data không được xác định và khi tôi đổi tên cả ba phiên bản $data thành $foobar, ví dụ này không hoạt động nữa.

Loại phép thuật nào đang diễn ra ở đây?

+2

Great câu hỏi. Tôi đã đấu tranh với điều này. – DavidHyogo

Trả lời

37

Biến số $data là biến được tạo sẵn dùng để chỉ đối tượng hiện tại bị ràng buộc. Trong ví dụ này là một trong các phần tử trong mảng viewModel.folders.

+0

Cảm ơn bạn đã giải thích ngắn gọn. Vì vậy, biến '$ data' chỉ tồn tại khi' foreach' được sử dụng? – dokaspar

+1

Bạn cũng có thể cung cấp giá trị của nó bằng cách sử dụng tham số dữ liệu trong khai báo mẫu. Ngoài ra, nếu không có tham số dữ liệu hoặc tham chiếu thì nó mặc định là toàn bộ mô hình xem cho mẫu –

+3

Có bất kỳ biến tích hợp nào khác không? – Nowaker

63

$ dữ liệu là một phần của Knockout's Binding Contexts.

Dưới đây là tất cả được xây dựng trong các biến:

  • $ mẹ
  • $ cha mẹ
  • $ root
  • $ phần
  • $ data
  • $ index (chỉ có sẵn trong foreach bindings)
  • $ parentContext
  • $ rawData
  • $ componentTemplateNodes
+0

Cảm ơn bạn đã liên kết. Tôi không tìm thấy nó trong điều hướng trên trang web. – Aligned

+0

Liên kết và danh sách rất hữu ích – DavidHyogo

+0

Điều này rất hữu ích! Cảm ơn bạn –

0

tôi đã làm cho nó hoạt động

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

xin hãy xem http://jsfiddle.net/bowen31337/48RDd/

+2

Làm cho nó hoạt động không phải là vấn đề. Một giải pháp thậm chí có sẵn trên các trang hướng dẫn. – dokaspar

Các vấn đề liên quan