代码之家  ›  专栏  ›  技术社区  ›  Alex Beardsley

在评估组件的MXML括号逻辑之前调用CreateChildren

  •  0
  • Alex Beardsley  · 技术社区  · 16 年前

    我有以下MXML:

    <mx:Script>
        var someBoolean:Boolean = determineSomeCondition();
    </mx:Script>
    
    ....
    
    <foo:MyComponent somePropertyExpectingIDataRenderer="{
                                        someBoolean
                                        ? new Component1ThatImplementsIDataRenderer()
                                        : new Component2ThatImplementsIDataRenderer()
                                                         }">        
    </foo:MyComponent>
    

    我还重写了createChildren()函数:

    override protected function createChildren():void {
        super.createChildren();
    
        //do something with somePropertyExpectingIDataRenderer
    }
    

    我的问题是:createChildren()在计算波形括号逻辑之前被调用,因此在createChildren()中,somePropertyExpectingDataRenderer为空。

    但是,如果我像这样通过mxml传递组件:

    <foo:MyComponent>
        <bar:somePropertyExpectingIDataRenderer>
            <baz:Component1ThatImplementsIDataRenderer/>
        </bar:somePropertyExpectingIDataRenderer>
    </foo:MyComponent>
    

    然后当调用createChildren()时,该属性不为空。这应该发生吗?如果是的话,我还应该考虑其他什么解决办法?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Florian F    16 年前

    为了访问MXML中设置的默认值,您必须等到组件经过第一个失效阶段。在调用createChildren()之后,在发送组件的initialize事件时发生这种情况。

    我会这样做:

    public function set myProperty(value:IDataRenderer):void
    {
        if (_myProperty != value)
        {
            myPropertyChanged = true;
            _myPropert = value;
            invalidateDisplayList();
        }
    }
    
    
    
    protected override function updateDisplayList(unscaledWidth:Number,
                                                  unscaledHeight:Number):void
    {
        super.updateDisplayList(unscaledWidth, unscaledHeight);
    
     ...
    
        if (myPropertyChanged )
            doWhateverYouNeedToDo(); 
    
    
    
    }
    

    (当然,本例假设更改属性需要重新绘制)

    推荐文章