Ext 4.1 - 如何获取使用Ext.define()创建的类的引用

时间:2014-07-28 13:35:49

标签: javascript extjs

我有一个用这样的方法创建的类:

Ext.define('MY.class.Manager', {
    ....
    ....
    ....
    manageStuff: function(){


    }
}

最初,我只在一个地方需要manageStuff功能,所以一切都很好。现在,我已经添加了另一个类,我需要能够在新类中调用manageStuff函数。

我试图在新课程中获得参考:

var ManagerClass = Ext.getClass('MY.class.Manager');

还有:

var ManagerClass = Ext.getClass('class.Manager');

两者都返回null

为了确保在我尝试获取Manager类之前已经定义了Manager,我输入了print语句:

他们读作:

...making manager class
...getting manager class

寻找任何帮助,因为我确信我对这个问题的解决方法开始时甚至都不正确。

2 个答案:

答案 0 :(得分:4)

要在其他不相关的类之间分享行为特征,请使用mixins:

Ext.define('MyApp.mixin.Foo', {
    foo: function(bar, baz) {
        alert(bar + ' ' + baz);
    }
});

Ext.define('MyApp.class.Foo', {
    mixins: [
        'MyApp.mixin.Foo'
    ],

    methodThatCallsFoo: function(bar, baz) {
        this.foo(bar, baz); // foo method has been mixed in the
    }
});

这适用于Ext JS 4.x +;请记住,在Ext JS 5中,这种机制变得更加强大,请参阅Ext.Mixin doc

答案 1 :(得分:0)

您可以使该方法可全局访问,因此两个类都可以使用它。首先,如果您还没有全局命名空间,可以使用Ext.namespace创建一个Ext。在这个例子中,我将MY作为命名空间,所有的全局变量和方法都将包含在其中,而MY.helper将包含你的辅助方法(如manageStuff)。< / p>

Ext.namespace(
    'MY',
    'MY.helper',
    // more namespaces inside 'MY' as needed ...
);

然后你可以声明你的辅助方法:

MY.helper.manageStuff = function() {
    // do stuff...
};

现在您可以在应用程序的任何位置使用此方法(以及MY内存储的任何其他内容)。

Ext.define('MY.class.Manager', {
    //...
    //...

    someFunctionThatCallsManageStuff: function(){
        MY.helper.managerStuff();
    }
});

注意:在javascript中,您可以将任何变量存储在全局命名空间中,并直接调用它们,但我发现它可能会使全局命名空间变得混乱。相反,我喜欢有一个包含我所有全局变量的变量。在此示例中,您的单个变量为MY。然后你可以添加&#34;包&#34;它可以组织你的全局变量,例如MY.helper

注意2:在上面的示例中使用Ext.namespace等效于以下内容:

//init MY as global variable
MY = {};
// add properties to MY
MY.helper = {};
// add properties to MY.helper
MY.helper.manageStuff = function() {
    // do stuff...
};