0

I am building a small application on VueJS 2.5.17 where I am having nested accordion data which I need to display through click events, I have a hierarchy of Root -> Roles -> Specialisation -> withRoles .... and so on. I am trying to get child elements on every click of their respective parents.

Following is my HTML Code:

<div class="panel-group" id="accordion1" v-for="items in accordianData">

    <div class="panel my-panel-warning">
        <div class="panel-heading">
            <h4 class="panel-title">
                <a style="color: #000; font-size: 14px" data-toggle="collapse" data-parent="#accordion1" :href="'#'+items.id">DOCUMENTED RELATIONSHIPS ({{count}})</a>
            </h4>
        </div>
        <div :id="items.id" class="panel-collapse collapse">
            <div class="my-panel-body">
                <div class="my-panel-body">
                    <div class="panel-group" :id="items.id" >
                        <div class="panel my-panel-warning" v-for="child1 in roles">
                            <div class="panel-heading">
                                <a data-toggle="collapse" :data-parent="'#'+items.id" :id="'child'+child1.id" :href="'#role'+child1.id" @click="getSpecialisation(child1.id, child1.name)">{{child1.name+" (0)"}}</a>
                            </div>
                            <div class="my-panel-body">
                                <div :id="'role'+child1.id" class="panel-collapse collapse">
                                    <div class="panel my-panel-warning" v-if="child1.id === child2.parent_id" v-for="child2 in specialisations[child1.name]">
                                        <div class="panel-heading">
                                            <a data-toggle="collapse" :data-parent="'#role'+child1.id" :id="'child2'+child2.id" :href="'#spec'+child2.id" @click="getWithRoles(child2.id)">{{child2.name+" (0)"}}</a>
                                        </div>
                                        <div class="my-panel-body">
                                            <div :id="'spec'+child2.id" class="panel-collapse collapse">
                                                <div class="my-panel-body">
                                                .
                                                .
                                                .
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

And calling following function in my methods:

getSpecialisation(id, name) {
    axios.get('specialisations?company_id='+this.company_id+'&role_id='+id, {headers: getHeader()}).then(response => {
        if(response.status === 200)
        {
            this.specialisations[name] = response.data.specialisations

        }
    })
},

But some how I am unable to display the data. Previously I tried v-for="child2 in specialisations" and in response I did this.specialisations = response.data.specialisations I was getting all similar child element for all parents I know this is wrong but just wanted to inform that I was getting data and my accordion was displaying child elements, but once I did according to above method getSpecialisation mentioned, I am unable to display the data.

I can see my data in vue console:

Specialisation Suggest me a better way for this.

Thanks

1 Answer 1

1

Instead of this.specialisations[name] = response.data.specialisations try:

Vue.set(this.specialisations, name, response.data.specialisations)

That should trigger Vue's change-detection.

Ps. When you see lots of nesting, this might be good time to split a big component up into smaller components.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.