【问题标题】:What event is fired when all SkinSparts are available in a SkinnableComponent?当 SkinnableComponent 中的所有 SkinSpart 都可用时会触发什么事件?
【发布时间】:2011-02-12 03:18:14
【问题描述】:

我正在(慢慢地)学习 Flex 4 并致力于为扩展 SkinnableComponent 的自定义组件设计皮肤。该组件全部在 ActionScript 中,基本上如下所示:

package components
{
    import spark.components.supportClasses.SkinnableComponent

    [SkinState("normal")]
    [SkinState("over")] 
    [SkinState("selected")]     
    public class AccountSummary extends SkinnableComponent
    {
        [Bindable]
        public var itemIndex:int = 0;

        [Bindable]
        public var accountName:String = "";

        [Bindable]
        public var accountNumber:String = "";   

        [Bindable]
        public var currentBalance:String = "";  

        [SkinPart(required="true")]
        public var lblAccountName:Label;

        [SkinPart(required="true")]
        public var lblCurrentBalance:Label;

        [SkinPart(required="true")]
        public var lblAccountNumber:Label;

        [SkinPart(required="true")]
        public var lblLastUpdated:Label;

        public function AccountSummary()
        {
            super();

            lblAccountName.text = accountName;
            lblCurrentBalance.text = currentBalance;
            lblAccountNumber.text = "Acc: " + accountNumber;
            lblLastUpdated.text = "Last Updated: "; 
        }

        override protected function getCurrentSkinState():String
        {
            return "normal";
        }
    }
}

我遇到的问题是各种 SkinPart 的构造函数中的 NULL REFERENCES,因为它们尚未创建。我试图找出访问它们以分配其 .text 值的最佳时间。我知道我可以覆盖 partAdded() 并在添加每个部分时添加 .text 值,但我宁愿只监听一些在它们都可用时调度的魔术事件。

我不确定这是否重要,但 accountName、accountNumber 变量是通过在主机组件上使用带有 dataProvider 的转发器来分配的。我不确定这是否也与 AccountSummary 组件何时可以使用数据有关——这可能还需要等待。我能够成功地使用 FlexEvent.CREATION_COMPLETE 将我所有的 .text 值分配给 SkinParts,但这是正确的事件/最佳实践吗?任何帮助将不胜感激!

【问题讨论】:

    标签: apache-flex


    【解决方案1】:

    您需要阅读Flex 4 Component LifeCycle,特别是关于component instantiation 的文章。构造函数执行时不会创建任何内容。您引用的值(accountName、lblCurrentBalance 等)也不会超出默认状态。

    您想在 partAdded() 方法中设置默认值。将你的构造函数代码改写成这样:

        public function AccountSummary()
        {
            super();
    
        }
    
    override protected function partAdded(partName : String, instance: Object):void{
     super.partAdded(partName, instance);
     if(instance == lblAccountName){
                lblAccountName.text = accountName;
     else if(instance == lblCurrentBalance){
    
     } else if (instance == lblCurrentBalance){
       lblCurrentBalance.text = currentBalance;
     } else if (instance == lblAccountNumber){
      lblAccountNumber.text = "Acc: " + accountNumber;
     } else if (instance == lblLastUpdated){
      lblLastUpdated.text = "Last Updated: "; 
     }
    
    }
    

    如果您是一名新程序员,您可能需要花一些时间来学习一些基本的编程概念。这个ActionScript 3 Guide 可以帮助您入门。如果您有其他语言的经验,但对 Flex 不熟悉,我强烈建议您花几天时间阅读 full flex documentation 以帮助您了解它。

    【讨论】:

    • 感谢您的建议,但正如我的问题所述 - 我希望不必求助于 partAdded 并逐个检查每个部分。我只是在寻找一些在添加所有部件后触发的事件。
    • 我会检查组件的生命周期,不过正如你所提到的。这可能是个好主意。
    • 好吧,阅读生命周期显示我在构造函数之后、partAdded 和 creationComplete 之前有几个事件,我可以利用这些事件一次找到所有可用的皮肤部件。
    • @WesleyJohnson 抱歉,我错过了您在原始问题中与 partAdded 相关的评论。我强烈建议您不要将这些与事件相关联。 partAdded() 的最佳替代方法是使用 commitProperties()。 partAdded() 和/或 commitProperties() 都将为您提供比侦听特定于实例化的事件更多的长期灵活性。我使用 partAdded() 进行初始创建属性设置(lblLastUpdated.text 是一个很好的例子)和 commitProperties() 用于处理动态更改(例如 lblCurrentBalance.text )
    • 太好了,感谢您的额外建议。我会试一试。 :)
    猜你喜欢
    • 2011-05-23
    • 2011-03-21
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多