Actionscript 3 从getdefinitionbyname创建的另一个类寻址子类

Actionscript 3 从getdefinitionbyname创建的另一个类寻址子类,actionscript-3,Actionscript 3,我有一个类“pagecompiler”,它执行以下操作: if(page){ removeChild(page); } switch (appModel.currentPage){ case "Programma": case "Winkelwagen": case "Fi

我有一个类“pagecompiler”,它执行以下操作:

if(page){
                removeChild(page);
            }
            switch (appModel.currentPage){
                case "Programma":
                case "Winkelwagen":
                case "Films":
                case "Contact":
                case "Reserveer":
                    var pageClass:* = getDefinitionByName("be.reynaertvincent.view.pages."+appModel.currentPage+"Page");
                    page = new pageClass();
                    addChild( page );
                    break;
}
contentBg = new ContentBg();
sidebarBg = new SidebarBg();
addChild(contentBg);
addChild(sidebarBg);
因此,它会根据开关创建一个页面,名称为(contactpage、filmspage、contactpage等)

每个页面都从一个名为“page”的类扩展而来

在“页面”类中,我执行以下操作:

if(page){
                removeChild(page);
            }
            switch (appModel.currentPage){
                case "Programma":
                case "Winkelwagen":
                case "Films":
                case "Contact":
                case "Reserveer":
                    var pageClass:* = getDefinitionByName("be.reynaertvincent.view.pages."+appModel.currentPage+"Page");
                    page = new pageClass();
                    addChild( page );
                    break;
}
contentBg = new ContentBg();
sidebarBg = new SidebarBg();
addChild(contentBg);
addChild(sidebarBg);
现在,当我在pagecompiler中执行以下操作时,我希望在contentBg上应用tween:

if(page){
   removeChild(page);
}
但我似乎无法从那里解决contentBg。我试过:

if(page.contentBg){
   tweenlite.to(page.contentBg,blablabla);
   //removeChild(page);
}

但是它没有被识别。任何人有任何想法吗?

在您的page类中,您可以创建一个公共方法:

  public function removeFromStage():void
  { 
       TweenLite.to ( contentBg , etc...   {.....  onComplete: remove})
  }

  //Called when the Tween is complete
  private function remove():void
  {
      parent.removeChild( this );

      //may come handy , don't forget to add a listener if you do this :)
      dispatchEvent ( new Event ( Event.COMPLETE ) );
  }
那么你可以这样称呼它

if(page != null ){
   //add Complete event listener if necessary...
   page.removeFromStage();
 }

我发现你的代码有很多问题。如果您纠正了这些错误,您的问题应该得到解决:

  • 您应该坚持命名约定:类名应该以大写字母开头。所以它应该是
    Page
    ,而不是
    Page
    。否则,您将有一个与类型同名的成员变量,并且可能会出现编译错误

  • getDefinitionByName()
    是一种代价高昂的实例化类的方法,因为它也不是类型安全的,所以您正在处理一个潜在的问题。既然您已经知道要实例化哪些类,为什么不将
    page
    作为
    page
    的实例,并扩展switch语句:

    private var page:Page;
    
    
    // some code here
    
    
    switch (appModel.currentPage){
        case "Programma":
            page = new ProgrammaPage();
            break;
        case "Winkelwagen":
            page = new WinkelwagenPage();
            break;
        case "Films":
            page = new FilmsPage();
            break;
        case "Contact":
            page = new ContactPage();
            break;
        case "Reserveer":
            page = new ReserveerPage();
            break;
        }
    addChild( page );
    
  • 如果如上所述,将
    page
    作为
    *
    的实例,则需要强制转换到
    page
    类才能访问其contentBg属性。大概是这样的:

    tweenlite.to (Page(page).contentBg, ....);
    

  • 但是,如果遵循前两个提示,应该已经解决了最后一点,因为编译器现在知道
    page
    属于
    page
    类型。这也是上面提到的小写命名不起作用的一个很好的例子,因为
    page(page)。contentBg
    显然是不明确的。

    非常好的观点:)不过我不鼓励将contentBg作为公共变量,似乎更好的做法是保护它,并在它被删除时简单地通知Page类处理它……这取决于Page类的其余部分。如果它只是一些显示对象的一个方便容器,而所有的逻辑都发生在其他地方,那么真的没有必要封装。哇,当我看到这样的答案时,我知道我有很多东西要学。尝试过这个,效果非常好。我不知道你可以编译这样的东西。只要提到所有阶级都是以上层阶级命名的。只是不习惯在flash builder之外输入。应该在示例代码中添加它。遗憾的是,我只能接受1个答案,因为这也是一个很好的解决方案。你以后会有用的,泰文