创建项目时获取 Ext.Container 的一些静态属性

Get get something of statics properties of Ext.Container when creating item

我有以下问题。我已经创建了继承的容器 Ext.Container 并使用项目数组创建一些项目。在构造函数中 我有异步逻辑并填充一些静态属性。我想用 创建容器项时此静态属性的值。我该如何解决这个问题?这是我逻辑的重要组成部分。

Ext.define('somename', {
    extend: 'Ext.Container',
    xtype: 'somextype',
    id: 'someid',
    statics: {
        property1: false,
        property2: null,
        property3: null
    },
    config: {
        dataAutoId: 'someid',
        items: [{
            xtype: 'panel',
            html: 'so here i want to use value of property1',
            cls: 'some',
            id: 'someid',
            dataAutoId: 'someid'
        }]
    },
    constructor: function () {
        this.callParent(arguments);

        // here i have implemented some asinhronous logic
        // and as a result set value of property1 
        var statics = this.statics();
        statics.property1 = 'test string';
    }
});

我试过:

html: this.statics.property1 

html: this.statics().property1 

但出现错误:

Uncaught Error: The following classes are not declared even if their files have been loaded.

编辑:

阅读 Sencha Touch 2 的文档后,我找到了解决方案。 在此之后可以将异步逻辑完成到构造函数中 我们可以将项目添加到容器中。如果异步逻辑需要很长时间,这个决定可能会导致问题。出于这个原因,最好显示一个微调器或类似的东西。这是解决方案的示例代码。

Ext.define('MyApp.view.Main', {
    extend: 'Ext.tab.Panel',
    xtype: 'main',
    requires: [
        'Ext.TitleBar',
        'Ext.Video'
    ],
    static: {
         title: null
    },
    config: {
        tabBarPosition: 'bottom'
    },
    constructor: function () {
        this.callParent(arguments);
        var statics = this.statics();
        statics.title = 'test string';
        this.renderItems();
    },
    'renderItems': function() {
        var statics = this.statics();
        this.add([{
            title: statics.title,
            iconCls: 'home',

            styleHtmlContent: true,
            scrollable: true,

            items: {
                docked: 'top',
                xtype: 'titlebar',
                title: 'Welcome to Sencha Touch 2'
            },

            html: [
                "dfdfhfjYou've just generated a new Sencha Touch 2 project. What you're looking at right now is the ",
                "contents of <a target='_blank' href=\"app/view/Main.js\">app/view/Main.js</a> - edit that file ",
                "and refresh to change what's rendered here."
            ].join("")
        }, {
            title: 'Get Started',
            iconCls: 'action',

            items: [{
                docked: 'top',
                xtype: 'titlebar',
                title: 'Getting Started'
            }, {
                xtype: 'video',
                url: 'http://av.vimeo.com/64284/137/87347327.mp4?token=1330978144_f9b698fea38cd408d52a2393240c896c',
                posterUrl: 'http://b.vimeocdn.com/ts/261/062/261062119_640.jpg'
            }]
        }]);
    }
});

感谢所有给我建议的人。

您不能以这种方式进行数据绑定。视图首先由框架加载,然后实例化。这意味着如果你想设置 html: this.property1 你的静态属性还没有值。

这个有效:

Ext.define('Fiddle.view.somename', {
    extend: 'Ext.Container',
    xtype: 'somextype',
    id: 'someid',
    statics: {
        property1: false,
        property2: null,
        property3: null
    },
    config: {
        dataAutoId: 'someid2',
        items: [{
            xtype: 'panel',
            html: 'so here i want to use value of property1',
            cls: 'some',
            id: 'someid3',
            dataAutoId: 'someid'
        }]
    },
    constructor: function () {
        this.callParent(arguments);

        // here i have implemented some asinhronous logic
        // and as a result set value of property1 
        var statics = this.statics();
        this.property1 = 'test string';
        this.down('#someid3').setHtml(this.property1);
    }
});

Uncaught Error: The following classes are not declared even if their files have been loaded

这只是意味着您的源文件命名与 类 它们实际声明的内容不一致。例如,您可能有一个名为 Foo.js 的文件,但它实际上包含 Ext.define('Bar'....

In constructor I'm have asynchronous logic and fill some static properties. I want to use value of this static properties when creating items of container. How I can solve this problem?

请牢记:只有在 Container 构建一段时间后 添加项目时,该方法才有意义。对 items 配置中指定的项目使用该方法将不起作用,因为这些项目将在 完成异步逻辑之前创建。因此,如果您需要在 items 配置中指定的项目上使用这些静态属性,则必须将异步逻辑置于 Container 之外,并且仅在属性可用后才构建它。