从数据库中删除后,Vue.js $删除不删除元素

时间:2016-03-21 12:13:13

标签: javascript laravel vue.js vue-resource

我正在使用Laravel并尝试学习Vue.js.我有一个正常工作的删除请求,并从数据库中删除该对象。问题是在成功删除后没有从DOM中删除它。我正在使用$remove方法并将其传递给完整的对象,所以我知道我错过了一些东西。

作为旁注,我有main.js作为入口点,PersonTable.vue作为组件。 PersonTable.vue包含该模板的模板和脚本。

这是我的Laravel观点:

<div id="app">
    <person-table list="{{ $persons }}">

    </person-table>
</div>

这是我的`PersonTable.vue:

<template id="persons-template">
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <h1>Persons List</h1>
                <table class="table table-hover table-striped">
                    <thead>
                    <tr>
                        <td>First Name</td>
                        <td>Last Name</td>
                        <td>Email</td>
                        <td>Gender</td>
                    </tr>
                    </thead>
                    <tbody>
                    <tr v-for="person in list">
                        <td>{{person.first_name }}</td>
                        <td>{{person.last_name }}</td>
                        <td>{{person.email }}</td>
                        <td>{{person.gender }}</td>
                        <td><span @click="deletePerson(person)">X</span>
                    </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
</div>
</template>

<script>
export default {

    template: '#persons-template',

    props: ['list'],

    methods: {
        deletePerson: function(person) {
            this.$http.delete('/person/' + person.id).then(
                function(response) {
                    this.persons.$remove(person);
                }
            );
        }

    },

    created: function() {
        this.persons = JSON.parse(this.list);
    }

};
</script>

我的main.js入口点:

var Vue = require('vue');

Vue.use(require('vue-resource'));

var Token = document.querySelector('meta[name="_token"]').getAttribute('content');

Vue.http.headers.common['X-CSRF-TOKEN'] = Token;

import PersonTable from './components/PersonTable.vue';

new Vue({


    el: '#app',

    components: { PersonTable },

})

3 个答案:

答案 0 :(得分:7)

我认为您需要将this绑定到响应函数:

function(response) {
    this.persons.$remove(person);
}.bind(this)

当你执行this.persons时,你仍然指的是Vue组件

编辑:可以尝试 -

props:['personJson'],
data:function(){
  return {
    persons:[]
  }
},
ready:function(){
  this.persons = JSON.parse(this.personJson)
}

想想,因为persons最初是一个字符串,Vue没有正确绑定反应能力?

答案 1 :(得分:2)

我认为您需要在创建的方法中使用this.$set,如果您不这样做,我担心Vue会失去反应性。

created方法中,您可以尝试以下方法:

export default {

    template: '#persons-template',

    props: ['persons'],

    methods: {
        deletePerson: function(person) {
            var self = this;
            this.$http.delete('/person/' + person).then(
                function(response) {
                    self.persons.$remove(person);
                }
            );
        }

    },

    created: function() {
        this.$set('persons',JSON.parse(this.persons));
    }

};

答案 2 :(得分:-1)

终于明白了。我需要将JSON数据传递给组件的data属性。这是代码。

在刀片文件中:

<div id="app">
    <person-table list="{{ $persons }}">

    </person-table>
</div>

在我的PersonTable.vue文件中:

<template id="persons-template">
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <h1>Persons List</h1>
                <table class="table table-hover table-striped">
                    <thead>
                    <tr>
                        <td>First Name</td>
                        <td>Last Name</td>
                        <td>Email</td>
                        <td>Gender</td>
                    </tr>
                    </thead>
                    <tbody>
                    // Notice how I am using persons here instead of list
                    <tr v-for="person in persons">
                        <td>{{person.first_name }}</td>
                        <td>{{person.last_name }}</td>
                        <td>{{person.email }}</td>
                        <td>{{person.gender }}</td>
                        <td><span class="delete person" @click="deletePerson(person)"><i class="fa fa-close"></i></span>
                        </td>
                    </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</template>

<script>
    export default {

        template: '#persons-template',

        props: ['list'],

        data: function() {
            return {
                persons: []
            }
        },

        methods: {
            deletePerson: function(person) {
                this.$http.delete('/person/' + person.id).then(
                    function(response) {
                        this.persons.$remove(person);
                     }
                );
            },
        },

        created: function() {
            // Pushing the data to the data property so it's reactive
            this.persons = JSON.parse(this.list);
        },

    };
</script>

感谢大家的贡献。由于修复此错误需要多长时间,我几乎抛弃了Vue。