Knockoutjs foreach third nested level not working

2019-08-27 15:42发布

问题:

This is my first project using knockout.js and I'm having an issue I can't resolve. I'm attempting to have foreach binding 3 levels deep. The first two levels work, but the third one does not. I can't see anything wrong with either my HTML or JavaScript.

<div class="skill-list-body">
    <div class="inner-skill-list-body">
        <div class="skill-list-publication-title" data-bind="text: publication"></div>
        <div data-bind="foreach: { data: categories, as: 'category' }">            
            <div>
                <div class="skill-list-category-title" data-bind="text: category.name"></div>
                <div class="category-container" data-bind="foreach: { data: realms, as: 'realm' } ">
                    <div class="realm-skill-box">
                        <div class="skill-list-realm-heading" data-bind="text: name">
                           <div data-bind="foreach: { data: skills, as: 'skill' }">
                                <div data-bind="text: skill.name"></div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>            
        </div>
    </div>
</div>

JavaScript

var viewModel = {
    publication: 'Medieval Fantasy Skills',
    categories: ko.observableArray([
            {
            name: 'Physical & Social Combat Skills',
            realms: ko.observableArray([
                    {
                        name: 'The Realm of Combat Tactics Skills',
                        skills: ko.observableArray([
                                { name: 'Craft Profession', id: 0 }
                            ])
                    }
                ])
            }
        ])
};

ko.applyBindings(viewModel);

回答1:

The problem is this right here:

<div class="skill-list-realm-heading" data-bind="text: name">
<div data-bind="foreach: { data: skills, as: 'skill' },   ">
    <div data-bind="text: skill.name"></div>
</div>
</div>

Your outer name binding effectively wipes out the contents of the node. Make the skills a sibling of the node, not a child.

<div class="skill-list-realm-heading" data-bind="text: name"></div>
<div data-bind="foreach: { data: skills, as: 'skill' },   ">
    <div data-bind="text: skill.name"></div>
</div>


回答2:

You need to close the name div tag to open the foreachthe binding -

http://jsfiddle.net/a3L60L4h/

<div class="skill-list-realm-heading" data-bind="text: name">
</div>
<div data-bind="foreach: { data: skills, as: 'skill' }">
     <div data-bind="text: skill.name"></div>
</div>

This is because the name binding overwrites the innerHtml which contains the foreach loop