Skip to content
Advertisement

access method outside vue component

i am new in vuejs. i have created comment feature similar with here, but due to certain circumstances i have to improvise it. i use vue component but it couldn’t access method inside my vue. if user has already post comment, any user may be able to reply that particular comment. however, i received vue warn “Property or method ‘replyComment’ is not defined on the instance but referenced during render”. can anyone help me please?

Vue.component('reply-komen',{
        template:'#replykomen',
        props:{
            edit:{
                type:Boolean,
                default:false
            },
            comment:{
                type:Object,
                default(){
                    return {
                        title: '',
                        body: '',
                        id: ''
                    }
                }
            }
        },
        methods:{
            replyComment: function(comment_id){
                console.log(comment.id);
                var id={{$complaint->id}};
                var users={{IlluminateSupportFacadesAuth::user()->id}};
                const item=this.$refs.balaskomen;
                const idkomen=item.dataset.id;
                console.log(idkomen);
                $.ajax({
                    url:'/api/complaint/comment',
                    type:"POST",
                    data:{
                        'users':users,
                        'id':id,
                        'comment':this.comment
                    },
                    success:function (response) {
                        komen2.comment.body= '';
                        komen2.fetchComments();
                    }
                })
            }
        }
    });

    var komen2=new Vue({
        el: '#kalas',
        data:{
            currentView:'',
            edit:false,
            comments:[],
            comment: {
                title:'',
                body: '',
                id: '',
            }
        },

        created: function(){
            this.fetchComments();
            this.createComment();
            this.editComment();
            this.deleteComment();
            this.showComment();
        },

        methods: {
            fetchComments: function(){
                var id={{$complaint->id}};
                $.ajax({
                    url:'/api/complaint/getcomments',
                    type:"GET",
                    data:{
                      'id':id
                    },
                    success:function (response) {
                        komen2.comments = response;
                    }
                })
            },

            createComment: function(){
                var id={{$complaint->id}};
                var users={{IlluminateSupportFacadesAuth::user()->id}};
                $.ajax({
                    url:'/api/complaint/comment',
                    type:"POST",
                    data:{
                        'users':users,
                        'id':id,
                      'comment':this.comment
                    },
                    success:function (response) {
                        komen2.comment.body= '';
                        komen2.fetchComments();
                    }
                })
            },

            editComment: function(comment_id){
                $.ajax({
                    url:'/api/complaint/'+window.Laravel.post_id+'/comment'+comment_id,
                    type:"PATCH",
                    data:{
                        'comment':this.comment
                    },
                    success:function (response) {
                        komen2.comment.body= '';
                        komen2.comment.id= '';
                        komen2.fetchComments();
                        komen2.edit = false;
                    }
                })
            },

            deleteComment: function(comment_id){
                $.ajax({
                    url:'/api/complaint/'+window.Laravel.post_id+'/comment'+comment_id,
                    type:"DELETE",
                    success:function (response) {
                        komen2.comment.body= '';
                        komen2.fetchComments();
                    }
                })
            },

            showComment: function(comment_id){
                for (var i = 0; i < this.comments.length; i++) {
                    if (this.comments[i].id == comment_id) {
                        this.comment.body = this.comments[i].body;
                        this.comment.id = this.comments[i].id;
                        this.edit = true;
                    }
                }
            }
        }
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="kalas">
    <div class="container">
        <h4>Add Comment</h4>
        <form action="" @submit.prevent="edit ? editComment(comment.id) : createComment()">
            <div class="input-group">
                <textarea name="body" v-model="comment.body" ref="textarea"  class="form-control"></textarea>
            </div>
            <div class="input-group">
                <button type="submit" class="btn btn-primary" v-show="!edit">Add Comment</button>
                <button type="submit" class="btn btn-primary" v-show="edit">Edit Comment</button>
            </div>
        </form>
        <br>
        <h4>Comments</h4>
        <ul class="list-group" v-for="comment in comments">
            {{--<li class="list-group-item" v-for="comment in comments">--}}
                <form>
                    <div class="input-group">
                        <textarea class="form-control">@{{comment.body}}</textarea>
                    </div>
                    <div class="input-group" ref="balaskomen" v-bind:id="comment.id">
                        <a class="btn btn-default" v-on:click="currentView='reply-komen'">Reply</a>
                        <a class="btn btn-danger" v-on:click=" deleteComment(comment.id)">Delete</a>
                    </div>
                </form>
            {{--</li>--}}
        </ul>
        <div class="container balas" >
            <component :is="currentView"></component>
        </div>
    </div>
</div>
<template id="replykomen" >
    <form action="" @submit.prevent="replyComment(comment.id)">
        <div class="input-group">
            <textarea name="body" v-model="comment.body" ref="textarea"  class="form-control"></textarea>
        </div>
        <div class="input-group">
            <button type="submit" class="btn btn-primary" v-show="!edit">Add Comment</button>
        </div>
    </form>
</template>

Advertisement

Answer

replyComment is defined in the second Vue instance (#kalas), but referenced in the first instance’s template (#replykomen). Move/copy the method to the first Vue instance’s methods to resolve the error.

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement