我刚开始学习KnockoutJS。这是webmail客户端文件夹导航的代码。在视图代码中,比较引用变量$data
和$root.chosenFolderId()
是否指向相同的内存位置。但我不明白$root.chosenFolderId()
的最初价值是什么?
<!-- Folders -->
<ul class="folders" data-bind="foreach: folders">
<li data-bind="text: $data, css : {selected: $data == $root.chosenFolderId()}, click: $root.goToFolder"></li>
</ul>
function WebmailViewModel() {
// Data
var self = this;
self.folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
self.chosenFolderId = ko.observable();
//Operations
self.goToFolder = function(folder){
self.chosenFolderId(folder);
};
};
ko.applyBindings(new WebmailViewModel());
答案 0 :(得分:1)
你90%在那里。正如您所说,foreach将遍历folders
数组,$data
将成为数组中的当前项。
拾取selectedFolderId的值
调用goToFolder
的点击绑定会将绑定的项目作为参数传递,因此chosenFolderId
值将设置为与所点击的&lt; li&gt;对应的文件夹项目。元件。
例如:点击&#39;存档&#39; element将触发绑定到folders[1]
的项目的click事件,从而使用goToFolder
值调用folders[1]
。
初始值
$root.chosenFolderId()
的初始值将为undefined
,因为您声明它没有参数。在初始视图中,如果您有:
self.folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
self.chosenFolderId = ko.observable(self.folders[0]);
然后是&#39;收件箱&#39;最初会被选中。
内存位置
您询问$data
和$root.chosenFolderId()
是否指向相同的内存位置。这大多是正确的 - 如果您的文件夹是一个对象数组,那么它们将包含相同的引用(对于所选项)。技术上字符串也是JS中的引用(参见解释https://stackoverflow.com/a/51193/625200),但将JS中的原语(字符串,数字,布尔值)视为值而不是引用更简单。