我刚刚开始学习KnockoutJS。这是用于Webmail客户端的文件夹导航的代码。在查看代码中,比较参考变量$data$root.chosenFolderId()是否指向相同的存储位置。但是我不明白$root.chosenFolderId()的初始值是多少?

Reference

视图:

<!-- 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());

最佳答案

您在那里90%。如您所述,foreach将遍历folders数组,而$data将成为数组中的当前项。

拾取selectedFolderId的值

调用goToFolder的单击绑定将把绑定到的项作为参数传递,因此chosenFolderId值将设置为与单击的

  • 元素相对应的文件夹项。

    例如:单击“ Archive”元素将触发绑定到folders[1]的项目的click事件,从而使用goToFolder值调用folders[1]

    初始值

    $root.chosenFolderId()的初始值将是undefined,因为您没有参数声明了它。在初始视图中,如果您具有以下选项,则不会显示任何文件夹:

    self.folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
    self.chosenFolderId = ko.observable(self.folders[0]);
    


    然后将首先选择“收件箱”。

    记忆体位置

    您询问$data$root.chosenFolderId()是否指向相同的存储位置。基本上是正确的-如果您的文件夹是一个对象数组,那么它们将包含相同的引用(用于所选项目)。从技术上讲,字符串也是JS中的引用(请参见说明https://stackoverflow.com/a/51193/625200),但是更容易将JS中的基元(字符串,数字,布尔值)视为值而不是引用。

    关于javascript - 等于ko.observable()的变量的默认值是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39941030/

  • 10-11 14:48