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>
- Flex中的set啊Flex中的set
- Flex中的set啊Flex中的set
- Flex get set方法
- flex中的flex-direction
- flex 中的flex-basis
- Flex的Super、get、set
- flex学习----flex中的MVC
- Flex set和get关键字用法
- flex生成po类get,set方法
- Flex set和get关键字用法
- Flex中的MVC模式
- Flex中的MySQL管理
- Flex中的MySQL管理
- Flex中的MySQL管理
- flex中的mysql管理
- Flex中的MySQL管理
- Flex中的弹出窗口
- Flex中的弹出窗口
- 简单的卡拉OK文字流动,定时器设置
- nginx的proxy配置(反向代理)
- mysql
- Android: 自定义窗口大小
- Flex中,跨List实现SHIFT多选的例子
- Flex中的set啊Flex中的set
- 算出大于一串数字的最小值,要求此数值的相邻两位不能相同
- 分享我做的截屏小工具
- 怎么把PPT转成EXE格式,详细步骤
- 怎么用C++生成WORD文档,详细步骤 - (参考基础上原创)
- nginx proxy https
- C#利用CER证书文件对远程Service进行验证
- NSIS脚本,检查权限和.NET环境 - (摘录及原创)
- 用批处理实现自动做Build