javascript - 使用 KnockoutJs 映射插件进行递归模板化

标签 javascript json mapping knockout.js

我正在尝试使用 ko.mapping plugin 在树上进行递归模板化,但我无法渲染它,除非我定义单独 每个级别的模板。

在以下情况下,我想重用mvvmTreeViewGroupTemplate 对于 mvvmTreeViewSubGroups 也是如此,但这没有被渲染,是 这是一个错误还是未实现的功能?

<div id="treeViewArea">
    <ul data-bind='template: { 
                            name: "mvvmTreeViewGroupTemplate", 
                            foreach: MvvmTreeItemGroups,
                            beforeRemove: function(elem) { $(elem).slideUp() },
                            afterAdd: function(elem) { $(elem).hide().slideDown() } 
                            }'>
    </ul>
</div>
        <script type="text/x-jquery-tmpl" id="mvvmTreeViewGroupTemplate">  <li> 
            <span data-bind="text: Title" class="mvvmTreeItemStyle"/></br/>     <ul data-bind='template: { 
                                    name: "mvvmTreeViewItemTemplate", 
                                    foreach: MvvmTreeItems, 
                                    beforeRemove: function(elem) { $  (elem).slideUp() }, 
                                    afterAdd: function(elem) { $  (elem).hide().slideDown() } 
                                    }'> 
            <ul data-bind='template: { 
                                    name: "mvvmTreeViewSubGroupTemplate", 
                                    foreach: this.MvvmTreeItemSubGroups, 
                                    beforeRemove: function(elem) { $  (elem).slideUp() }, 
                                    afterAdd: function(elem) { $  (elem).hide().slideDown() } 
                                    }'> 
            </ul> 
            </ul>  
    </li>  
    </script>
    <script type="text/x-jquery-tmpl" id="mvvmTreeViewSubGroupTemplate">  <li> 
            <span data-bind="text: Title" class="mvvmTreeItemStyle"/></br/>     
<ul data-bind='template: { 

                                    name: "mvvmTreeViewItemTemplate", 
                                    foreach: MvvmTreeItems, 
                                    beforeRemove: function(elem) { $  (elem).slideUp() }, 
                                    afterAdd: function(elem) { $  (elem).hide().slideDown() } 
                                    }'> 
            </ul>
      </li>  
    </script>

JSON 和脚本如下所示,

var data = { 
            MvvmTreeItemGroups: [ 
            { 
                Id: 1, Title: 'Group 1', 
                MvvmTreeItemSubGroups: [{ 
                    Id: 1, Title: 'Group 11', 
                    MvvmTreeItems: [{ Id: 'i111', Title: 'Item 111' }, 
{ Id: 'i112', Title: 'Item 112'}] 
                }, 
                    { 
                        Id: 1, Title: 'Group 121', 
                        MvvmTreeItems: [{ Id: 'i121', Title: 'Item 
121' }, { Id: 'i122', Title: 'Item 122'}] 
                    }], 
                MvvmTreeItems: [{ Id: 'i11', Title: 'Item 11' }, { Id: 
'i12', Title: 'Item 12'}] 
            }, 
                { 
                    Id: 2, Title: 'Group 2', 
                    MvvmTreeItemSubGroups: [{ 
                        Id: 1, Title: 'Group 211', 
                        MvvmTreeItems: [{ Id: 'i211', Title: 'Item 
211' }, { Id: 'i212', Title: 'Item 212'}] 
                    }, 
                    { 
                        Id: 1, Title: 'Group 121', 
                        MvvmTreeItems: [{ Id: 'i121', Title: 'Item 
121' }, { Id: 'i122', Title: 'Item 122'}] 
                    }], 
                    MvvmTreeItems: [{ Id: 'i21', Title: 'Item 21' }, 
{ Id: 'i22', Title: 'Item 22'}] 
                }] 
        }; 

var viewModel = ko.mapping.fromJS(data);
        console.log(viewModel);
        ko.applyBindings(viewModel, treeViewArea);

最佳答案

我在 this google thread 中得到了问题的答案。这不完全是一个“递归模板”问题,这是因为如果没有该名称的数组,模板不知道如何渲染。

有两种方法可以解决此问题:

  1. 检查 MvvmTreeItemGroups 数组是否 在渲染之前实际存在 像这样的模板,

    {{if $data.MvvmTreeItemGroups }}       
        <ul data-bind='template: { 
        name: "mvvmTreeViewGroupTemplate", 
        foreach: MvvmTreeItemGroups }'> 
        </ul>                 
    {{/if}}
    
  2. 使用in关键字检查 MvvmTreeItemGroups确实存在

    {if 'MvvmTreeItemGroups' in $data}}
        <ul data-bind='template: { 
        name: "mvvmTreeViewGroupTemplate", 
        foreach: MvvmTreeItemGroups
        }'> 
        </ul> 
    {{/if}}
    

完整的 fiddle 位于 http://jsfiddle.net/mikekidder/Xs7sy/

关于javascript - 使用 KnockoutJs 映射插件进行递归模板化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4750516/

相关文章:

javascript - 粘贴文本时去除textarea中的字符

Javascript:按类名选择所有复选框

c# - MVC : Ace editor post

javascript - 为什么我的 reactContext 变量仍然为空?

python - 成对映射 numpy 数组

iphone - 如何在 Swift 中将字典数组从一个 TableView 传递到另一个自定义 TableView

php - 通知系统无法正常工作 JSON/PHP

json - json 响应 spring boot 中缺少字段

javascript - 通过映射转置和转换数组

.net - 类型投影有相反的,还是仍然是投影(或只是映射)?