将javascript函数与knockout、viewmodels和dynatree混合匹配

Mixing and matching javascript functions with knockout, viewmodels and dynatree

本文关键字:dynatree 混合 viewmodels javascript 函数 knockout      更新时间:2023-09-26

因此,引用这个jsfiddle:http://jsfiddle.net/Gaa3G/我正在尝试混合使用一些javascript函数来操作具有淘汰视图模型的动态树。正在调用代码,但没有发生任何事情(除了显示调试警报)。

视图(html):

<script id="itemTmpl" type="text/html">
    <li>
        <span >
            <span data-bind="text: name" />
            <input type="checkbox" data-bind="checked: isManager" />
        </span>
        <ul data-bind="template: { name: 'itemTmpl', foreach: children }"></ul>
    </li>
</script>
<button data-bind="click: addNodes">Add Nodes</button>

视图模型:(不管怎么说,其中一部分,其余部分可以在jsfiddle上看到)

            self.addNodes = function() {
                alert("I'm adding a node...");
                var rootNode = $("#dynatree").dynatree("getRoot");
                var childNode = rootNode.append({
                    title: "Programatically addded nodes",
                    tooltip: "This folder and all child nodes were added programmatically.",
                    isFolder: true
                });
                childNode.append({
                    title: "Document using a custom icon",
                    icon: "customdoc1.gif"
                });
            };

在我的开发计算机上,我看到了一个错误,上面写着"在初始化之前不能调用dynatree上的方法;试图调用方法‘getRoot’",但在jsfiddle上没有看到这个错误。这可能有关联,也可能没有关联!

那么我是不是错过了什么?这是特定插件(dynatree)的一些神秘问题吗?(我猜不会,因为在谷歌搜索其他与jquery相关的插件时,会出现很多类似的错误消息,这些消息似乎与淘汰自定义绑定处理程序中的"setTimeOut"有关。我不知道为什么setTimeOut在那里,我只是从原始的jsfiddle中复制了它!

编辑1:所以我想到了更新可观察数组——毕竟,这就是树的绑定!

我把这个添加到我的"addNodes"方法中:

            var bob = new Person({
                id: 3,
                name: 'Bob',
                isManager: true,
                children: []
            });
            self.persons.push(bob);

瞧,"鲍勃"确实被添加到了树上。

这可能会成为一个问题,因为当树绑定到视图模型时,树似乎仍然认为它没有初始化,这会阻止诸如"getRoot"之类的操作。希望马丁能在某个时候出现,并就此发表意见!

基本上,您在错误的节点上调用.dyntree()。

您在内部UL元素上有databind="dynatree:{}",而不是在#dynatree元素上。因此,该UL是根节点。

以这种方式更新:

             self.addNodes = function() {
                alert("I'm adding a node...");
                // use the correct selector below:
                var rootNode = $("#dynatree > ul").dynatree("getRoot");
                // call the proper method .addChild instead of .append
                var childNode = rootNode.addChild({
                    title: "Programatically addded nodes",
                    tooltip: "This folder and all child nodes were added programmatically.",
                    isFolder: true
                });
                childNode.addChild({
                    title: "Document using a custom icon",
                    icon: "customdoc1.gif"
                });
            };

更新的演示