1

我有一个 vue.js 应用程序,其中有几个像这样的子组件:

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

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

我也尝试过使用 jQuery ajaxStop,但它似乎不适用于 vue-resource。谁能帮帮我吗?

4

1 回答 1

1

我需要做一次类似的事情,而我最终做的事情(除了在 vue 渲染完成后使用v-cloakdata来显示应用程序)是跟踪每个需要变量中是否已经有数据(或没有),然后才“显示”应用程序(为此我使用了一个内部标志来控制是显示应用程序还是加载消息)。

它与此类似(使用 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主应用程序上的方法。

于 2016-05-22T21:23:06.033 回答