【问题标题】:KnockoutJS and Nested Sortable List (Two-Dimensional)KnockoutJS 和嵌套可排序列表(二维)
【发布时间】:2013-09-26 23:03:26
【问题描述】:

我正在寻找一种在 KnockoutJS 中实现简单嵌套/可嵌套树结构的方法;它应该只允许两个级别。

到目前为止,我发现的是这个(以及 SO 上的一系列非常相似的方法):Knockout.js nested sortable bindings

但是,在这个例子中 - 和其他例子中,“Containers”不能变成“Children”,反之亦然。

基本上,我正在寻找这样的结构:http://jsfiddle.net/uhVAW/2/

即它最终会呈现一个包含两个级别的列表:父类别及其子类别。

我在 Knockout ViewModel 中的树形结构采用这种形状(没有所有更新逻辑):

 var VM = function(cats)
 {
    this.categories = ko.observableArray(cats); // bound to the list
 }

 var Category = function
 {
    this.name = ko.observable();
    this.children = ko.observableArray([]); // if exists (i.e. if the cat is a parent), this is bound to a list within the <li>
 }

所以,本质上:

  1. 排序父级
  2. 在父母中对孩子进行分类
  3. 孩子可以成为父母,反之亦然
  4. 只允许 n 层嵌套(在我的例子中是 2 层)

干杯!

【问题讨论】:

    标签: javascript knockout.js tree nested knockout-2.0


    【解决方案1】:

    这是一个使用带有递归模板的knockout-sortable 的简单树视图:http://jsfiddle.net/rniemeyer/Lqttf/

    视图模型看起来像:

    var TreeItem = function(name, children) {
       this.name = ko.observable(name);
       this.children = children && ko.observableArray(children);
    };
    
    ko.applyBindings({
        root: new TreeItem("root", [
           new TreeItem("A", [
              new TreeItem("A1"),
              new TreeItem("A2")
           ]),
           new TreeItem("B", [
              new TreeItem("B1"),
              new TreeItem("B2")
           ])
        ])
    });
    

    视图如下所示:

    <script id="nodeTmpl" type="text/html">
        <li>
            <a href="#" data-bind="text: name"></a>
            <div data-bind="if: children">
               <ul data-bind="sortable: { template: 'nodeTmpl', data: $data.children }"></ul>            
            </div>
        </li>
    </script>
    
    <ul data-bind="template: { name: 'nodeTmpl', data: root }"></ul>
    

    【讨论】:

    • 这真是太棒了——非常感谢!我稍微修改了它以确保始终至少有一个空的 observableArray。否则无法将项目添加到空列表:jsfiddle.net/Lqttf/1 |话虽这么说:您对我如何只允许两个级别有任何指示吗?再次感谢!
    • 好吧,我有点慢。我可以将 allowDrop 绑定到一个可观察的布尔值,该布尔值从第二级开始返回“false”。 :-)
    • @niemeyer 先生,首先感谢您提供与 KNOCKOUT-SORTABLE 、 KNOCKOUT-RECURSIVE 相关的解决方案。先生,我也在寻找你上面提到的精确解决方案,我想要一个解决方案来计算每个节点的总数。每个节点都有两个属性(标题,金额),所以我需要在父节点上显示金额(子项)的总和。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2013-08-30
    • 2017-09-27
    相关资源
    最近更新 更多