Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ext 4.1-如何获取对使用Ext.define()创建的类的引用_Javascript_Extjs - Fatal编程技术网

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

Javascript Ext 4.1-如何获取对使用Ext.define()创建的类的引用,javascript,extjs,Javascript,Extjs,我使用如下方法创建了一个类: Ext.define('MY.class.Manager', { .... .... .... manageStuff: function(){ } } 最初,我只需要在一个地方使用manageStuff函数,所以一切都很好。现在,我添加了另一个类,需要能够从新类中调用manageStuff函数 我试图在新课程中获得参考: var ManagerClass = Ext.getClass('MY.class.Manager

我使用如下方法创建了一个类:

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


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

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

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

var ManagerClass = Ext.getClass('class.Manager');
两者都返回
null

在尝试获取Manager类之前,为了确保已定义该类,我在print语句中添加了:

其内容如下:

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

正在寻找任何帮助,因为我确信我解决此问题的方法一开始就不正确。

您可以使该方法全局可访问,以便两个类都可以使用它。首先,如果您还没有全局名称空间,可以使用
Ext.namespace
创建一个带有Ext的名称空间。在本例中,我将使
MY
成为包含所有全局变量和方法的命名空间,并使
MY.helper
成为包含助手方法(如
manageStuff
)的命名空间

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
。然后,您可以向其中添加“包”来组织全局文件,例如
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...
};

您可以使该方法全局可访问,这样两个类都可以使用它。首先,如果您还没有全局名称空间,可以使用
Ext.namespace
创建一个带有Ext的名称空间。在本例中,我将使
MY
成为包含所有全局变量和方法的命名空间,并使
MY.helper
成为包含助手方法(如
manageStuff
)的命名空间

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
。然后,您可以向其中添加“包”来组织全局文件,例如
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...
};

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

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
    }
});

这适用于ExtJS4.x+;请记住,在Ext JS 5中,该机制变得更加强大,请参见。

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

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
    }
});

这适用于ExtJS4.x+;请记住,在Ext JS 5中,这种机制变得更加强大,请参见。

如果两个类使用相同的方法,您可能应该将该方法放入两个类的公共父类中(假设这些类是相关的),或者使其成为两个类都可以访问的静态方法(您可以将名称空间添加到全局名称空间中,并将方法放在其中)它们是不相关的,因此我更愿意将其设置为静态的,并且两者都可以访问。我该如何操作/使用Ext创建名称空间?如果两个类使用相同的方法,您可能应该将该方法放在两个类的公共父类中(假设类是相关的),或者使其成为两个类都可以访问的静态方法(您可以向全局名称空间添加名称空间,并将该方法放入其中)它们是不相关的,所以我更喜欢将其设置为静态的,并且两者都可以访问。我该如何做/使用Ext创建名称空间?向下投票的原因:这种方式不是最佳做法。请参阅我的答案。没错,在这种情况下,混合可能会更好。但是,我遇到过混合对我来说没有多大意义的时候,当指定ic方法到处都在使用。因此,我认为我的答案中的信息仍然有用,即使这不是最佳实践。无论如何,我很好奇你会为这个场景做些什么:我有一个应用程序,有大量的渲染器函数,我把它们都放在一个文件中。其中大多数用于多个不同的类,其中一些用于大量的classes.你认为最好的设计是什么?否决理由:这种方式不是最好的做法。看我的答案。没错,在这种情况下,混合可能会更好。但是,我遇到过混合对我来说没有太大意义的时候,当一种特定的方法被广泛使用时。所以,我认为我答案中的信息仍然是正确的有用,即使这不是最佳实践。无论如何,我很好奇你会为这个场景做些什么o:我有一个应用程序,有大量的渲染器函数,我把它们都放在一个文件中。其中大多数用于多个不同的类,其中一些用于大量的类。你认为最好的设计是什么?唯一的问题是我看到的是,我正在使用的两个类已经存在,并且已经编写了数千行。我只需要类A中的一个函数就可以被类B访问,所以我不认为在这种情况下混合是可行的。而且类本身并不是真正面向对象的,在这种情况下混合是有意义的。唯一的问题是em我预见到我正在使用的两个类已经存在,并且已经编写了数千行。我只需要类A中的一个函数就可以被类B访问,所以我不知道如何将它们混合在一起