Domanda

che sto cercando di fare template ricorsiva su un albero utilizzando il ko.mapping plug-in , ma non riesco a di averlo reso, a meno che io definisco separato Modelli per ogni livello.

Nel seguente caso, voglio riutilizzare il mvvmTreeViewGroupTemplate per mvvmTreeViewSubGroups pure, ma questo non viene eseguito il rendering, è questo un bug o funzione non implementata?

<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 e script assomiglia a questo,

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);
È stato utile?

Soluzione

ho ricevuto una risposta alla mia domanda nel questa discussione Google . Non è esattamente una questione di 'template ricorsivo', è perché il modello non sa come rendere se non c'è allineamento con quel nome.

Ci sono due modi per risolvere il problema:

  1. Verificare se gamma MvvmTreeItemGroups in realtà esiste prima del rendering della template in questo modo,

    {{if $data.MvvmTreeItemGroups }}       
        <ul data-bind='template: { 
        name: "mvvmTreeViewGroupTemplate", 
        foreach: MvvmTreeItemGroups }'> 
        </ul>                 
    {{/if}}
    
  2. Usa la parola chiave per il check in MvvmTreeItemGroups davvero esiste

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

Il violino completo è a http://jsfiddle.net/mikekidder/Xs7sy/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top