我已经实现了initComponent类的Container方法,并通过items方法加载了Promise配置。

debugging期间的东西首先进入callParent行,然后执行转到Promise方法。.我必须重新加载浏览器才能获取Promise响应。

我在then()中尝试了initComponent方法,但给出了错误。如何实现这种用法?

-带有initComponent的容器类;

Ext.define('MyApp.view.Bar', {
    extend: 'Ext.container.Container',
    xtype: 'barview',
    requires: [],
    controller: 'barctrl',
    viewModel: {
        type: 'barvm'
    },

    initComponent: function () {
        let me = this;
        let fooInfo = MyApp.FooInfoClass.getFooInfo(); //There is a debugger in FooInfoClass but miss this one

        if (fooInfo) {
            if (fooInfo.self) {
                me.items = [
                    {
                        xtype: 'componentA'
                    }
                ];
            } else if (fooInfo.reference) {
                me.items = [
                    {
                        xtype: 'componentB'
                    }
                ];
            } else {
                me.items = [
                    {
                        xtype: 'componentC'
                    }
                ];
            }
        }

        debugger //Firstly comes to this one then goes to Promise
        me.callParent(arguments);
    }
});


-承诺的课程和方法;

Ext.define('MyApp.FooInfoClass', {
    requires: [],
    singleton: true,
    endpoint: MyApp.Url(),

    getFooInfo: function () {
        let me = this;
        let responseInfo = localStorage.getItem('foo-info');

        return JSON.parse(responseInfo);
    },

    setFooInfo: function (foo) {
        let me = this;

        me.foo = JSON.stringify(foo);
        localStorage.setItem(me.fooInfo, me.foo);
    },

    fooInfo: function () {
        let me = this;

        return new Ext.Promise(function (resolve, reject) {
            Ext.Ajax.request({
                url: me.endpoint + '/info',

                success: function(response, opts) {
                    let obj = Ext.decode(response.responseText);
                    let data = obj.data[0];
                    debugger //Secondly comes to here!
                    me.foo = data;
                    me.setFooInfo(me.foo);
                    resolve(me.foo);
                },

                failure: function(response, opts) {
                    console.log('server-side failure with status code ' + response);
                    reject(response);
                }
            });
        });
    }
});

最佳答案

在拥有所需数据之前,请勿推迟完成initComponent功能。要么先获取数据,然后将所有必需的信息一起实例化该组件(在Ext.create()内执行Promise.then()),要么让该组件获取其必需的信息,并在运行时基于这些信息添加子组件。在callParent上调用initComponent之前,您真正需要了解的只有很少的事情。

如果我是您,则不使用me.items =,而是使用me.add(),以便在初始化后在运行时添加子组件。

我为您做了一个简单的小提琴:https://fiddle.sencha.com/#view/editor&fiddle/2k9r

09-20 02:25