About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Apr

    2

    想法需求:在 Flex 开发过程中,可能想要对一个类的静态变量使用绑定技术(绑定语法),然后可以在其它任意组件 / 控件、自定义类中使用被绑定的静态变量。这是一个非常好的想法,尝试编写类似如下的代码:

    package {
        [Bindable]
        public class StaticClass{
            static public var test:String ="test"
        }
    }

    或类似如下的代码:

    package {
        public class StaticClass{
            [Bindable]
            static public var test:String ="test"
        }
    }

    然后在其它任意的任组件中希望调用它:

    <mx:Label text="{StaticClass.test}"/>

    最后,发现绑定失败了。在调试的控制输出面板中会看到如下提示:

    warning: unable to bind to property 'XXXXX' on class 'XXXXXXXXX' (class is not an IEventDispatcher) 

    然后,打开 Adobe 官方在线帮助《Using the Bindable metadata tag》,发现没有任何关于类的静态变量使用绑定技术的说明。

    原因如下:这是因为绑定技术底层实现的技术方式是通过 EventDispatcher 类型的对象派发事件来实现的,而类对象本身不是 EventDispatcher 类型的对象,(这里需要原格区分类对象本身”和“类生成的对象),既便一个类扩展了 EventDispatcher 类或实现了 IEventDispatcher 接口,类对象本身是不会改变的(类本身没有类似 dispatchEvent 这样的静态方法),改变的是类生成的对象的类型(类生成的对象带有 dispatchEvent 实例方法)。只要了解了原因,就能找到解决方法。

    解决方法:通过一个单例模式,将类对象本身改变成为类生成的对象,就可以派发绑定相关的事件了。如下样例代码:

    package {
        public class StaticClass{

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

            //单例派发绑定事件
            static private var _instance:StaticClass = new StaticClass();

            public class StaticClass{

                if (_instance) {
                    throw new Error("这是一个单例");
                }

                static public function getInstance():StaticClass {
                    return StaticClass._instance;
                }

                static public function set filePathSelected(value:String):void{
                    StaticClass.getInstance().test = value;
                }

                static public function get filePathSelected():String{
                    return StaticClass.getInstance().test;
                }
            }
        }
    }

     在其它组件中调用:

    <mx:Label text="{StaticClass.getInstance().test}"/>

    完美了。

    More...

    Dec

    22

    当在MXML语言中使用花括号调用类成员时的一个规则:类属性成员、get与set成员需要[Bindable] 元标签,并且会监视其相应变化;类方法成员本身不需要使用[Bindable] 元标签,但也不会监视方法成员内部被使用到过的属性成员、get与set成员的变化。

    如下样例代码:createFullName()方法定义时不需要使用[Bindable] 元标签,但当btn按扭点击时如果改变了firstName类属性成员的值,它并不会反应到lab实例的text属性中。

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
    <![CDATA[
    [Bindable]
    public var firstName:String = "11";
    public var lastName:String = "99" ;
    public function createFullName():String{
    return firstName + " " + lastName;
    }
    ]]>
    </mx:Script>
    <mx:Label id="lab" x="80" y="103" text="{createFullName()}"/>
    <mx:Button id="btn" x="85" y="144" label="Button" click="firstName='22';"/>
    </mx:Application>

    More...