Flex中的set啊Flex中的set

来源:互联网 发布:淘宝买六味地黄丸 编辑:程序博客网 时间:2024/05/22 10:53

Flex中的set function就是给属性赋值的,说起来简单,但是遇到一个相关的bug还真晕。其实几天前就遇到类似问题了,我没有深究,赶进度嘛。今天晚上Alan修一个bug的时候又遇到了,作为小leader,我就得帮他解惑。正好自己也研究下,就算晚上没白等QA做build了。刚刚又上网找了找,还真没类似的文章,那我这个算原创了吧?哇咔咔……和大家分享吧,说不定有谁遇到类似的问题,痛苦半天呢。(已经知道答案的也不要鄙视我,毕竟我也是新手不是?)

问题:Flex中的set在什么情况下不起作用?

言归正传,先说说这个问题的由来吧:

ModelLocator.getInsternce().buildModel.selectedBuildVo = vo;

就是代码中的这句话,设了断点怎么也跑不进去(selectedBuildVo是一个set function)在这个set中,有一点逻辑来处理vo中的一些数据的,从而改变绑定在页面上的一个对象。

不绕弯子了,上面那个问题的答案是:当set中的值在内存中的地址和所要赋值的对象的地址一样时,也就是说,selectBuildVo和vo的地址一样时(同一个对象),这个set不起作用,当然,set中的逻辑也不会跑起来。这个和函数还是不一样的,function的话,什么时候调用,什么时候就会老老实实去跑的……

同时,让我郁闷的是,第一次遇到这样的情况,原来没一点类似经验啊,根本不会往这个地方想,呵呵。教条主义害死人啊,谁也没和我数过给一个set function赋值的时候一定会跑进去啊。看来以后还是需要多用方法,别什么都省事,想用set function来实现。

作为一种习惯,我顺带把这个问题和.net中的set对比了一下,发现Flex的set和.net的set还真不一样,哈哈,.net中的set,无论什么时候赋值,都会乖乖响应的……

============================

下面贴出证明上述结论的codes,先.net吧:

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ConsoleApplication1

{

    class TestVo

    {

        public TestVo() { }

        public string test = "TEST";

    }

 

    class Program

    {

        static TestVo _vo1;

 

        static TestVo vo1

        {

            get { return _vo1; }

 

            set { Console.WriteLine("Call SET"); _vo1 = value; }

        }

 

        static void Main(string[] args)

        {

            TestVo vo2 = new TestVo();            

            Console.WriteLine("Try first set, this time the address are NOT same");

            vo1 = vo2;

 

            vo2.test = "test2";

 

            Console.WriteLine("Try second set, this time the address are same");

            vo1 = vo2;

 

            Console.ReadKey();

        }

    }

}

下面是Flex的demo:

TestVo.as文件:

 

package

{

    [Bindable]

    public class TestVo extends Object

    {

        public function TestVo()

        {

        }

 

        varpublic var test:String="TEST";

    }

}

TrySet.mxml文件:

 

<?xml version="1.0" encoding="utf-8"?>

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"

  xmlns:s="library://ns.adobe.com/flex/spark"

  xmlns:mx="library://ns.adobe.com/flex/mx"

  creationComplete="init()">

 

    <fx:Script>

    <![CDATA[

        import mx.controls.Alert;

 

        private var _vo1:TestVo=new TestVo();

        private var vo2:TestVo=new TestVo();

 

        [Bindable]

        private function get vo1():TestVo

        {

            return _vo1;

        }

 

        private function set vo1(v:TestVo):void

        {

            _vo1=v;

            Alert.show("Here, I am in set function");

        }

 

        private function init():void

        {

            vo2=new TestVo();

        }

 

        protected function button1_clickHandler(event:MouseEvent):void

        {

            vo2=new TestVo();

            //HERE, get a new address in memory, it's a new object.

            vo2.test=new Date().toLocaleTimeString();

            vo1=vo2;

        }

 

        protected function button2_clickHandler(event:MouseEvent):void

        {

            vo2.test=new Date().toLocaleTimeString();

            //HERE, the vo2 has same address in memory as before

            vo1=vo2;

        }

    ]]>

    </fx:Script>

 

    <fx:Declarations/>

 

    <s:HGroup fontFamily="Arial"

          verticalCenter="0"

          horizontalCenter="0"

          fontSize="16"

         fontWeight="bold">

        <s:Label text="{vo1.test}"/>

        <s:Button label="address changed, when set value"

             click="button1_clickHandler(event)"/>

        <s:Button label="address not changed, when set value"

             click="button2_clickHandler(event)"/>

    </s:HGroup>

</s:Application>