如何从包含组件的vuejs中获取普通数组?

时间:2016-01-28 14:55:32

标签: javascript jquery arrays vue.js vue-resource

我正在使用对我的数据库的调用来检索一些结果并将它们推送到数组中。然而,当我console.log(this.activeBeers)我没有得到一个阵列,而是一个对象。如何获取普通数组而不是对象?

Vue.component('beers', {
    template: '#beers-template',

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

    ready: function() {
        function getActiveBeers(array, ajax) {
            ajax.get('/getbeers/' + $('input#bar-id').val()).then(function (response) {
                $.each(response.data, function(key, value) {
                    array.push(value.id);
                });
            }, function (response) {
                console.log('error getting beers from the pivot table');
            });

            return array;
        }

        console.log(this.activeBeers = getActiveBeers(this.activeBeers, this.$http));
    },

    props: ['beers']
});

3 个答案:

答案 0 :(得分:2)

AJAX以异步方式完成,因此您将无法返回您尚未拥有的值。

你应该在([.-_]+) 之后控制你的东西,看看你收到了什么。

答案 1 :(得分:2)

正如其他答案指出的那样,在填充数组的回调被执行之前,您的getActiveBeers()调用正在返回。

你的数组是一个对象的原因是因为Vue包装/扩展了底层数据中的数组,因此它可以截取并响应任何变异方法 - 如push,pop,sort等。

您可以在this.activeBeers功能的开头记录ready,看它是否为对象。

顺便说一下,如果要记录activeBeers的展开/普通数组,可以使用组件的$log方法:

this.$log(this.activeBeers);

答案 2 :(得分:1)

另一个答案是正确的,getActiveBeers发送HTTP请求,然后立即返回数组,它不会等待ajax请求返回。您需要在ajax请求的success函数中处理activeBeers的更新。您可以使用.bind()函数确保成功函数中的this引用Vue组件,这样您就可以将ID直接推送到activeBeers数组中

Vue.component('beers', {
    template: '#beers-template',

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

    ready: function() {
        this.getActiveBeers();
    },

    methods: {
        getActiveBeers: function(){

            this.$http.get('/getbeers/' + $('input#bar-id').val()).then(function (response) {

                $.each(response.data, function(key, value) {
                    this.activeBeers.push(value.id);
                }.bind(this));

                console.log(this.activeBeers);

            }.bind(this), function (response) {

                console.log('error getting beers from the pivot table');

            });

        }
    }

    props: ['beers']

});