如何知道在vue.js中加载所有子组件的时间

时间:2016-05-22 12:06:44

标签: ajax vue.js vue-resource vue-component

我有一个vue.js应用程序,其中有几个子组件,如下所示:

<main-app>
   <child-component></child-component>
   <child-component></child-component>
   <child-component></child-component>
...
</main>

加载页面后,我可以使用ready挂钩知道组件已完成加载。现在,使用ajax数据填充这些组件,可以通过单击按钮手动更新它们。我可以使用broadcastdispatch方法从每个子组件中获取数据。但我想在用户点击按钮时向用户显示预加载器,并在所有ajax请求完成时隐藏它。为此,我需要知道所有子组件都已完成加载。过去4-5小时我无法做到这一点。谷歌和SO没有多大帮助。

我也尝试过使用jQuery的ajaxStop,但它似乎不适用于vue-resource。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

我需要做一次类似的事情和我最终做的事情(除了使用v-cloak在vue渲染完成后显示应用程序)跟踪data中的每个require变量是否已经有数据(或者不是)只有这样,&#34;显示&#34;应用程序(为此我使用内部标志来控制是否显示应用程序或加载消息)。

这与此类似(这使用了underscore.js):

var app = new Vue({
    el: 'body',
    data: {
        data1: [],
        data2: [],
        data3: []
    },
    ready: function() {
        this.showApp();

        // Data 1
        $.getJSON('/path-to/data1', function(data) {
            app.$set('data1', data);
            app.showApp();
        });

        // Data 2
        $.getJSON('/path-to/data2', function(data) {
            app.$set('data2', data);
            app.showApp();
        });

        // Data 3
        $.getJSON('/path-to/data3', function(data) {
            app.$set('data3', data);
            app.showApp();
        });
    },
    methods: {
        showApp: function() {
            // Check if all data was loaded
            var requiredData = _.every(['data1', 'data2', 'data3'], function(el) {
                return _.size(this[el]) > 0;
            }, this);

            // If it was, enable the app
            if (requiredData) {
                $(this.$els.loading).hide();
                $(this.$els.app).fadeIn();
            }
        }
    }
});

由于您使用的是组件,因此您必须使用事件来触发主应用上的showApp方法。