我已经实现了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