javascript - 使用 knockoutjs 分层 ul 列表崩溃

标签 javascript jquery html css knockout.js

我想点击 ul li 元素并折叠并打开它们。工作代码是 here

var viewModel = {
    treeRoot: ko.observableArray()
};

var TreeElement = function(name, children) {
   var self = this;
   self.children = ko.observableArray(children);
   self.name = ko.observable(name);
}

var tree = [
    new TreeElement("Russia", [
        new TreeElement("Moscow")
    ]),
    new TreeElement("Germany"),
    new TreeElement("United States", 
        [ 
            new TreeElement("Atlanta"),
            new TreeElement("New York", [ 
                new TreeElement("Harlem"),
                new TreeElement("Central Park")
            ]) 
        ]),
    new TreeElement("Canada", [
        new TreeElement("Toronto")
    ])
];

viewModel.treeRoot(tree);

ko.applyBindings(viewModel);

像这样的html

<script id="treeElement" type="text/html">
    <li>
        <span data-bind="text: name"></span>
        <ul data-bind="template: { name: 'treeElement', foreach: children }">
        </ul>
     </li>
</script>    

 <ul data-bind="template: { name: 'treeElement', foreach: $data.treeRoot }"></ul>

最佳答案

您需要在 TreeElement 上引入一个标志 isCollapsed,您可以从 click 绑定(bind)事件处理程序中切换它。

并且基于 isCollapsed,您需要借助计算的可观察对象过滤掉您的 children 集合:

var TreeElement = function(name, children) {
   var self = this;
   self.children = ko.observableArray(children);
   self.isCollapsed = ko.observable();
   self.collapse = function() {
       self.isCollapsed(!self.isCollapsed());
   }
   self.visibleChildren = ko.computed(function(){
       if (self.isCollapsed())
           return [];
       return children;
   });
   self.name = ko.observable(name);
}

并且您需要使用 click 绑定(bind)处理程序更新模板并使用 visibleChildren 而不是 children 集合:

<script id="treeElement" type="text/html">
  <li>
     <span data-bind="text: name, click: collapse"></span>
     <ul data-bind="template: { name: 'treeElement', foreach: visibleChildren }">
     </ul>
  </li>
</script> 

演示 JSFiddle .

关于javascript - 使用 knockoutjs 分层 ul 列表崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23624741/

相关文章:

javascript - 如何在 Href 中使用 Javascript 变量

html - DIV 作为另一个 DIV 中的填充 block

javascript - 使用 OnClick 函数 JavaScript 删除 Firebase 节点

javascript - 如何指定bower-install的目标目录?

javascript - 单击时更改输入 + 标签周围标签和 div 的颜色

javascript - 使用 JS 读取 JSON 元素

javascript - 替换 for 循环中的 id 属性

javascript - 如何使用 Bloodhound/Typeahead 忽略标点符号和符号

jquery - 无法识别的功能 - 但为什么呢?

javascript - 如何在数据表中过滤 AJAX 调用的输出?