从getdefinitionbyname创建的另一个类中寻址子节点

时间:2011-01-05 12:46:53

标签: actionscript-3

我有一个“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;
}

所以根据开关创建页面,名称是(联系页面,电影页面,联系页面等)

这些页面中的每一页都从一个名为“page”的类扩展。

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

contentBg = new ContentBg();
sidebarBg = new SidebarBg();
addChild(contentBg);
addChild(sidebarBg);

现在我想在pagecompiler中执行以下操作时在contentBg上应用补间:

if(page){
   removeChild(page);
}

但我似乎无法从那里找到contentBg。我试过了:

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

但它没有得到认可。有没有任何人?

2 个答案:

答案 0 :(得分:2)

我发现您的代码存在许多问题。如果你纠正它们,你的问题应该得到解决:

  1. 您应该坚持使用命名约定:类名称应以大写字母开头。所以它应该是Page而不是page。否则,您有一个与类型同名的成员变量 - 以及潜在的编译错误。

  2. 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 );
    
  3. 如果您page *的实例,如上所示,则需要转换为Page类才能访问其contentBg属性。像这样:

    tweenlite.to (Page(page).contentBg, ....);
    
  4. 但是,如果您遵循前两个提示,那么最后一点应该已经解决,因为编译器现在知道page的类型为Page。这也是一个很好的例子,为什么上面提到的小写命名不起作用,因为page(page).contentBg显然是模棱两可的。

答案 1 :(得分:0)

在您的网页课程中,您可以创建一个公共方法:

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