访问在其他AS类中的Flex应用程序的MXML文件中实例化的对象

时间:2011-07-29 14:09:14

标签: flex actionscript-3

我在Flex应用程序的单个MXML文件中声明并实例化了一个对象:

public var CDN:CDNClass = new CDNClass;

我想在另一个.as文件中声明的另一个类中访问同一个CDN对象(及其公共方法和属性):

package my.vp
{
    import my.media.CDNClass;

    public class SyncConnectorManager
    {

        private function syncMessageReceived(p_evt:SyncSwfEvent):void
        {
            switch (p_evt.data.msgNm)
            {
                case "startStream" :
                    // Play a stream
                    CDN.parsePlayList(p_evt.data.msgVal);
                    break;

但是当我尝试在.as文件中定义的类中的方法中访问CDN对象中的公共方法parsePlayList时,我收到以下错误:

  

访问未定义的属性CDN

我想要这样做的原因是将我的应用程序的逻辑分解为多个AS文件并且具有最少的MXML文件,可能只有一个。

谢谢 - 非常感谢任何帮助。也许我的OOD / OOP思想在这里不正确?

2 个答案:

答案 0 :(得分:2)

IT取决于您的班级架构。要使代码生效,必须在CDNClass内定义并实施SyncConnectorManager实例。

通常,您可以随时调用组件,但不应该调用

一种选择是将CDNClass的实例传递给SyncConnectorManager内的变量。将此变量添加到SyncConnectionManager类:

public var CDN:CDNClass = new CDNClass;

在某些时候这样做:

syncConnectorManagerInstance.CDN = CDN;

这样两个类都可以访问同一个CDN实例,并且可以在其上调用方法。

答案 1 :(得分:1)

是的,你的OOP思想在这里不正确。您应该记住类和实例之间的差异。该行在当前类中声明了一个字段,并使用实例启动它:

public var CDN:CDNClass = new CDNClass;

因此,您的MXML 的当前实例(您可以像往常一样考虑使用其他符号的AS类)具有公共字段。要使用CDN实例进行操作,您需要以下内容:

  • 从MXML 的实例中读取CDN(就公开而言)的值。你需要一些参考。
  • 您的MXML 的实例可以引用SyncConnectorManager的实例,而SyncConnectorManager应该有一种方法可以在那里注入CDN的值。类似的东西:

你的班级:

package my.vp
{
    import my.media.CDNClass;

    public class SyncConnectorManager
    {
        private var CDN:CDNClass;

        public function SyncConnectorManager(CDN:CDNClass)
        {
             this.CDN = CDN;
        }

        private function syncMessageReceived(p_evt:SyncSwfEvent):void
        {
            switch (p_evt.data.msgNm)
            {
                case "startStream" :
                    // Play a stream
                    CDN.parsePlayList(p_evt.data.msgVal);
                    break;

在你的情况下,SyncConnectorManager类没有声明CDN(你提到的编译器错误的问题)和实例化(即使你只声明了字段,NPE的问题)。

作为底线,我建议您按照ActionScript naming and coding conventions与其他人和团队成员讨论您的代码:)