绑定到KendoUI TreeView中的嵌套数组值

时间:2014-02-25 18:21:28

标签: mvvm kendo-ui treeview kendo-treeview

我们正在评估KendoUI web以用于我们的所有项目,并且我遇到了TreeView Widget的问题(或缺乏理解)。

我正在尝试使用MVVM TreeView,当我从模板绑定到嵌套数组值时遇到问题。我通过添加一个节点及其子节点单击按钮来动态构建树视图。我想将每个叶子(子)节点绑定到MVVM中该节点上的文本值。这似乎对树的初始加载很有效,但是在向viewModel添加更多节点之后,绑定似乎已停止工作。

这似乎比我认为的要困难得多,这让我觉得我错过了一些东西。

任何人都可以帮忙解释一下吗?

谢谢,

杰森

的jsfiddle

我在本次讨论中创建了一个JSFiddle示例:http://jsfiddle.net/jsonsee/9B9pT/

HTML

<script id="treeTemplate" type="text/x-kendo-template">
    <span>
        #: item.name #
        # if (!item.hasChilren) { #
            <input type = 'text' data-bind = "value: treeData[#: item.parentIndex #].items[#: item.childIndex #].displayValue"/> 
        # } #
    </span>
</script>

<div id="content">
    <div id="form">
        <label>Item Name:
            <input type="text" data-bind="value: form.itemName" />
        </label>
        <button data-bind="click: form.onAddItem">Add Item</button>
        <div class="console">
            <h2>Output:</h2>
            <div id="myConsole"/>
        </div>
    </div>
    <h2>TreeView</h2>
    <div data-template="treeTemplate" data-role="treeview" data-bind="source: treeData" />
</div>

的Javascript

(function ($) {
    var viewModel = kendo.observable({
        itemIndex: 0,
        form: {
            itemName: '',
            onAddItem: function (e) {
                e.preventDefault();

                var itemToAdd = {
                    name: viewModel.get('form.itemName'),
                    hasChilren: true,
                    items: (function () {
                        var children = [];
                        for (var i = 0; i < 3; i++) {
                            children.push({
                                name: viewModel.get('form.itemName') + '-child-' + i,
                                parentIndex: viewModel.get('itemIndex'),
                                childIndex: i,
                                displayValue: '',
                                hasChilren: false
                            });
                        }
                        return children;
                    })()
                }

                if (viewModel.get('treeData')) {
                    viewModel.get('treeData').push(itemToAdd);
                } else {
                    viewModel.set('treeData', kendo.observableHierarchy([itemToAdd]));
                }

                viewModel.set('form.itemName', '');
                viewModel.set('itemIndex', viewModel.get('itemIndex') + 1);
            }
        }
    });

    $(document).ready(function () {
        kendo.bind(document.body, viewModel);
        viewModel.bind('change', function (e) {
            console.log('viewModel changed!');
            var output = JSON.stringify(viewModel, undefined, 2);
            console.log('----------------------------------------------------');
            console.log(output);
            console.log('----------------------------------------------------');
            $("#myConsole").html("<pre>" + output + "</pre>");
        });
    });
})(jQuery);

修改

发表评论:

在我的应用程序中,我将元素从页面左侧的工具选项板拖动到中心窗格。在删除项目时,我构建了一个树视图。每个节点都有一组孩子,那些孩子没有孩子。所以树是一层深的(如果算上父级,则为两层)。

树视图中的每个节点都是这样呈现的(从父节点开始)

* parentNode.name
--->* childNode.name [textbox bound to this node's displayValue property in viewModel]
--->* childNode.name [textbox bound to this node's displayValue property in viewModel]
--->* childNode.name [textbox bound to this node's displayValue property in viewModel]
--->* childNode.name [textbox bound to this node's displayValue property in viewModel]

问题

我遇到问题的部分是将子节点文本框绑定到分层dataSource中相应viewModel字段的displayValue属性。我尝试了很多不同的方法,但是“sort-of”工作的方法是直接从模板绑定访问数组元素:data-bind =“value:treeData [#:item.parentIndex#]。items [#: item.childIndex#]。displayValue“

请注意,添加第二个节点后,上述绑定不起作用。那就是问题所在。我同意代码很复杂,这是问题原因的一部分......我觉得有些不对劲。因此,要么剑道MVVM不支持直接绑定到嵌套数组元素,要么我做错了。

更新输出

我更新了JSFiddle并发布了输出以更好地说明问题。注意viewModel上的第二组子元素如何具有空白的displayValue属性,即使我在视图中更改了它们。添加第一个节点后,绑定因某些原因无效。

新JSFiddle:http://jsfiddle.net/jsonsee/9B9pT/

viewModel的打印输出

{
  "itemIndex": 2,
  "form": {
    "itemName": ""
  },
  "treeData": [
    {
      "name": "a",
      "hasChilren": true,
      "items": [
        {
          "name": "a-child-0",
          "parentIndex": 0,
          "childIndex": 0,
          "displayValue": "1",
          "hasChilren": false,
          "items": [],
          "index": 0
        },
        {
          "name": "a-child-1",
          "parentIndex": 0,
          "childIndex": 1,
          "displayValue": "2",
          "hasChilren": false,
          "items": [],
          "index": 1
        },
        {
          "name": "a-child-2",
          "parentIndex": 0,
          "childIndex": 2,
          "displayValue": "3",
          "hasChilren": false,
          "items": [],
          "index": 2
        }
      ],
      "index": 0,
      "expanded": true
    },
    {
      "name": "b",
      "hasChilren": true,
      "items": [
        {
          "name": "b-child-0",
          "parentIndex": 1,
          "childIndex": 0,
          "displayValue": "",
          "hasChilren": false,
          "index": 0
        },
        {
          "name": "b-child-1",
          "parentIndex": 1,
          "childIndex": 1,
          "displayValue": "",
          "hasChilren": false,
          "index": 1,
          "selected": true
        },
        {
          "name": "b-child-2",
          "parentIndex": 1,
          "childIndex": 2,
          "displayValue": "",
          "hasChilren": false,
          "index": 2
        }
      ],
      "index": 1,
      "expanded": true
    }
  ]
}

0 个答案:

没有答案