??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲午夜在线,国产黄在线播放,免费人成黄页在线观看忧物http://www.aygfsteel.com/19851985lili/category/19815.html☜GivE mE HapPy ? zh-cnSat, 03 Mar 2007 03:19:57 GMTSat, 03 Mar 2007 03:19:57 GMT60Flex中自定义事ghttp://www.aygfsteel.com/19851985lili/articles/101171.html☜♥☞MengChuChen☜♥☞MengChuChenWed, 28 Feb 2007 09:00:00 GMThttp://www.aygfsteel.com/19851985lili/articles/101171.htmlhttp://www.aygfsteel.com/19851985lili/comments/101171.htmlhttp://www.aygfsteel.com/19851985lili/articles/101171.html#Feedback0http://www.aygfsteel.com/19851985lili/comments/commentRss/101171.htmlhttp://www.aygfsteel.com/19851985lili/services/trackbacks/101171.htmlFlex中的事g机制
2006-11-28 10:37
一. 事g?
事g可以由外设触? 比如:键盘,鼠标, 也可能是外部输入, 比如:web service的返?
事gq能q件的外观和生命周期发生变化时触发, 比如:lg的创建或者改变大?
所有用户与应用交互都会产生事g.用户没有直接与应用交互也可能产生事g, 比如:数据装蝲完毕.
你可以在E序中用事件监听器监听q些事g. 事g监听器是函数Ҏ(gu)用于响应指定的事? 有时也称之ؓ事g处理?
Flex的事件模型基于DOM3事g模型.
lg产生z֏事gq消?监听)其他事g.如果一个对象想要了解其他对象事件的信息, 可以注册一个监听器.
当事件发生时,对象z֏此事件到所有注册过的监听器?
lg有Flex提供的内Z? 也可以用派?监听模型定义自己的事件监听器, q指定监听器监听何种事g.
? 事g简?
当一个事件被z֏出来? 事g对象从根节点开始自上而下开始扫描display list, 一直到目标对象, 查每个节Ҏ(gu)否有相应的监听器.
目标对象指的是display list中生事件的对象. 比如:
<mx:Panel>
<mx:HBox>
<mx:VBox>
<mx:Button />
</mx:VBox>
</mx:HBox>
</mx:Panel>
如何此时 resize了VBox, 则会从根(Application)开? 下来查Panel, HBox, 直到目标对象-产生resize事g的VBox为止.

? 事g的派?
Flex中可以通过dispatchEvent()Ҏ(gu)手工z֏事g, 所有UIComponent的子c都可以调用此方?
语法:
objectInstance.dispatchEvent(new Event("event_type"):Boolean
参数event_type是Event对象的type属? 函数的返回值LTrue.
可以使用此方法派发Q意事? 而不仅仅是用戯定义事g, 比如: 可以z֏一个Button的Click事g.
var result:Boolean = buttonInstance.dispatchEvent(new Event(MouseEvent.CLICK));

在Flex应用中不是必d新派发的事gq行处理, 如果触发了一个事? 而没有对应的Listener?Flex忽略此事?
如果想给Event对象d新属? 必ȝ承Eventc?然后定义新属?

?事g的传?
事g触发? Flex?个检事件监听器的阶D? 3个阶D늚发生的顺序如?
1. 捕获
2. 目标
3. 上Q
在Q意一个阶D? 节点们都有机会操作事? 比如: 用户点击了一个在VBox中的Button,
在捕获阶D? Flex查Application对象(根节?和VBox是否有监听器处理此事? Flex然后在目标阶D触发按钮的监听?
在上阶D? VBox和应用以与捕获阶D늛反的序再次获得Z处理事g.
在Actionscript3.0?你可以在L目标节点上注册事件监听器. 但是部分事g会被直接传给目标节点,比如Socketc?
捕获阶段的节炚w序是从父节点到子节点? 而上阶D刚好相?
捕获事g~省是关闭的,也就是说如果要捕获事? 必须昑ּ指定在捕获阶D进行处?
每一个Event都有target和currentTarget属? 帮助跟踪事g传播的过E?

捕获阶段:
在捕获阶D?Flex在显C列表中查事件的先是否注册了事件的监听? Flex从根节点开始顺序而下.
大多数情况中, 根节Ҏ(gu)Application对象. 同时, Flex改变事g的currentTarget?
~省情况? 在此阶段,没有容器监听事g. use_capture参数的值是False,在此阶段d监听的唯一Ҏ(gu)是在调用add_listener?
传入一个ؓTrue值的use_capture参数, 比如:
myAccordion.addEventListener(MouseEvent.MOUSE_DOWN, customLogEvent, true);
如果是在Mxml中添加监? Flex讄此参CؓFalse, 没有办法q行修改.
如果讄了use_capture为True, 那么事g不会上? 如果既想捕获又想上Q必调?addEventListener两次.
一ơuse_capture参数为true, 一ơؓfalse;
捕获很少使用, 上Q的用更为普?

目标阶段:
在目标阶D? FlexȀ发事件的监听E序, 不检查其他的节点.

上Q阶段:
事g只在bubbles属性ؓTrue时才q行上Q. 可以上Q的事件包? change, click, doubleClick, keyDown, keyUp, mouseDown, mouseUp.
在上阶D? Flex改变事g的currentTarget属? 而target属性是初始z֏事g的对?

查询事g阶段:
使用事g的eventPhase可以获得事g当前的阶D?
1: CAPTURE_PHASE
2: AT_TARGET
3: BUBBLING_PHASE
CZ: private function determineState(event:MouseEvent):Void { Debug.trace(event.eventPhase + ":" + event.currentTarget.id); }

停止传播:
使用下面两个函数停止事g的传?
stopPropagation()
stopImmediatePropagation()

件是一个非常有用的功能Q通常用于信息传递交互大大提高程序编写的灉|性。在高语言中都会集成这斚wҎ(gu);Flex也不例外几乎所有控件中都集成了大量的事Ӟ如果Button的Click事g{。但实际应用中控件自有的事g是不能满真实需要的Q特别在自己~写自定义控件时Q自定义控g内部信息的改变如何及旉知所在的容器变得很更要;q个时候自定义事gpv到它的作用?br />
       在Flex中定义事件有两中情况Q分别是ActionScript和MXML中定义?br />
       在ActionScript中定义:

[Event(name="myEnableEvent", type="flash.events.Event")]

public class MyComponent extends UIComponent

{

           ...

}
在MXML中定义:

<mx:Metadata>

    [Event(name="DataChange", type="DataChangeEvent")]

</mx:Metadata>
DataChangeEvent事g参数的定义:

import flash.events.Event;

public class DataChangeEvent extends flash.events.Event

{

       public function DataChangeEvent()

       {

              super("DataChange");

       }

       public var Data:Object;

}

在自定义控g中定义和触发事g:

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

<mx:Form xmlns:mx="http://www.adobe.com/2006/mxml" width="212" height="56">

<mx:Metadata>

        [Event(name="DataChange", type="DataChangeEvent")]

    </mx:Metadata>

<mx:Button label="Button" click="Change()"/>

       <mx:Script>

              <![CDATA[

                     function Change():void

                     {

                            this.dispatchEvent(new DataChangeEvent());

                     }

              ]]>

       </mx:Script>

</mx:Form>
容器接收相关自定义控件事Ӟ

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*">

      

       <ns1:EmployeeCombo x="146" y="132" DataChange="onChange(event)" >

       </ns1:EmployeeCombo>

       <mx:Script>

              <![CDATA[

                     import mx.controls.Alert;

                     function onChange(e:DataChangeEvent)

                     {

                           

                     }

              ]]>

       </mx:Script>

</mx:Application>
其实自定义事件的现实也很?但v着非常重要的作用;正是因ؓ有了事g的机Ӟ使得大部分重复的功能抽取到自定义控g中,从而达C个很高的代码重用性?img src ="http://www.aygfsteel.com/19851985lili/aggbug/101171.html" width = "1" height = "1" />

☜♥☞MengChuChen 2007-02-28 17:00 发表评论
]]>
架构一个Flex应用E序http://www.aygfsteel.com/19851985lili/articles/101169.html☜♥☞MengChuChen☜♥☞MengChuChenWed, 28 Feb 2007 08:55:00 GMThttp://www.aygfsteel.com/19851985lili/articles/101169.htmlhttp://www.aygfsteel.com/19851985lili/comments/101169.htmlhttp://www.aygfsteel.com/19851985lili/articles/101169.html#Feedback0http://www.aygfsteel.com/19851985lili/comments/commentRss/101169.htmlhttp://www.aygfsteel.com/19851985lili/services/trackbacks/101169.html架构一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">Flex应用E序

使用Flex的web开发者可能最初会对用L面模型感到困惑。虽然传l的、类似servlet的、请?响应Qrequest-responseQ模型将会在Flex中应用,但是却存在一U更好的Ҏ(gu)。由于ActionScript语言中的“[Binding]”标{,你可以把你的视图l定到模型数据,q样一来模型的更改׃自动影响到视图?a target="_blank" tip="">Cairngorm 微型架构使这U方法得到Ş式化Q而且它也是那些想要领会如何“让它们在一起工作”的开发者的一个非常好的v炏V在q篇文章中我描q变量绑定,Ҏ(gu)驱动开发和Carigorm?a target="_blank" tip="">NoteTag中是如何一起工作的

q里是一个典型的Flex应用E序可能的架构:


域(DomainQ?br />·l成域模型的所有类。在NoteTag中,它包含了NotesQ记录)QTasksQ事务)以及SubscriptionsQ订阅)QSubscriptions是相关Notes或Tasks的一个群集(collectionQ)?br />
模型QModelQ?br />·一个保存域模型的可l定实例的一个单体(singletonQ。在NoteTag中,ModeLocator单体保存了用L订阅清单Q用Lq接Q当前的订阅Q当前的记录以及其他?br />
视图QViewQ?br />·UIlgQ通常来说是MXML文gQ虽然ƈ不LQ。依赖状态(state-dependentQ的UIlg被绑定到ModeLocator的实例变量。如果ModeLocator中数据被标记为“[Bindable]”,那么它的M改变都会DUI自动更新。NoteTag中的一个例子就是NoteListViewQ它昄了当前订阅中的记录列表。如果当前的订阅或者它的Q何一个记录改变了Q那么NoteListView会自动更新来反应这些改变?br />
控制器(ControllerQ?br />·同事仉动的Commands一h行特性所需的下部构造。NoteTag中的例子包括GetSubscriptionCommand, GetNoteCommand 以及其他?br />
业务QBusinessQ?br />·完成域中对象操作的业务逻辑c,l常呼叫q程服务q且异步q回l果。对大部分NoteTag的业务逻辑来说SubscriptionManagercLentry point?br />
服务QServiceQ?br />·服务层,保存了用来呼叫远E服务(HTTPService,RemoteService和WebServiceQ的所有类。NoteTag 使用了一个服务工厂(factoryQ类集合Q减M对特D的HTTP服务的部|Ԍq些HTTP服务来自q行HTTP 服务呼叫的组件?br />
多数应用E序Ҏ(gu)都有上面的一些或者全部结构。下面是一个典型特性的工作程Q?br />1.视图QviewQ广播一个事件?br />2.单体控制器(controllerQ收到这个事Ӟ把它映射到相应的CommandQƈ且执行这个Command?br />3.Command委托适当的业务(BusinessQ对象执行业务逻辑?br />4.业务QBusinessQ对象执行业务逻辑Q可能对不同的Serviceq行一个或者多个异步呼叫,q且通过分派QdispatchQ一个新的事件给Command来返回结果?br />5.Command结果赋l单体模型?br />6.l定到单体模型中的数据的所有视N自动更新?br />
它是如何在一个特定的Ҏ(gu)中工作的呢Q当用户从Notes列表Q看下面Q在屏幕的顶端)中选中了一个NoteӞq个Note׃从适当的存储(Blogger或TypePadQ中加蝲q显C在~辑器中Q看下面Q在屏幕的底端)Q?br />

1.q播事g

当用户在W一个Note上点LQNoteListView分派一个事Ӟ如下Q?br />
E序代码 E序代码
// NoteListView.mxml
private function getSelectedEntry(event:ListEvent) : void
{
  var selectedEntry:TagBasedEntry =
    TagBasedEntry(currentFeed.entries[event.rowIndex-1]);
  Application.application.dispatchEvent(
    new GetNoteEvent(selectedEntry.metadata,true));
}


2. 对事件相?/strong>

因ؓNoteTag的Front Controller已经把它自n注册来监听所有的Command EventQ当GetNoteEvent 被分z时候它?yu)会被通知?br />
E序代码 E序代码
// NoteTagController.as
public class NoteTagController extends FrontController
{
  public function NoteTagController()
  {
    addCommand(LoginEvent.EVENT_LOGIN, LoginCommand);
    addCommand(GetNoteEvent.EVENT_GET_NOTE, GetNoteCommand);
    addCommand(GetTaskEvent.EVENT_GET_TASK, GetTaskCommand);
    addCommand(PostNoteEvent.EVENT_POST_NOTE, PostNoteCommand);
    // more commands...
  }
}


Cairngorm?Front Controller通过执行适当的command提供了监听事件和响应事g的基构造?br />
3. 执行 Command

Z获得q个NoteQNoteTag需要呼叫存储了用户note的blog服务器。实CCairngorm的Command接口的GetNoteCommand像q样Q?br />
E序代码 E序代码
// GetNoteCommand.as
internal class GetNoteCommand extends ChainedCommand
{
  public override function execute(event:CairngormEvent):void
  {
    var initialEvent:GetNoteEvent = GetNoteEvent(event);

    var subscriptionManager:SubscriptionManager =
      ModelLocator.getInstance().subscriptionManager;

    setNextEventHandler(subscriptionManager,
      handleLoadNote,
      LoadNoteEvent.EVENT_LOAD_NOTE,
      onSubscriptionFault,
      SubscriptionFaultEvent.EVENT_SUBSCRIPTION_FAULT);
    subscriptionManager.loadNote(initialEvent.metadata);
  }

  private function handleLoadNote(event:LoadNoteEvent):void
  {
    // handle result here...
  }

  // ...
}


Q你可能已经发现了GetNoteCommand l承?ChainedCommand——这个类使用setNextEventHandler Ҏ(gu)共同q行一pd异步呼叫。在以后的文章里Q我更深入地讨论ChainedCommandQƈ大体说一下异步回应器QresponderQ。)

4. 执行业务逻辑

SubscriptionManager通过执行对tag服务器和blog服务器一pd的HTTP service呼叫来触发Note的加载。当note被加载完毕时QSubscriptionManager 分z一个LoadNoteEventQ这个事件将会被GetNoteCommand.handleLoadNoteQ参见下一条)触发?br />
5. 更新模型

GetNoteCommand 通过把加载的Note赋给ModelLocator中适当的数据成员来响应事g?br />
E序代码 E序代码
// GetNoteCommand.as
internal class GetNoteCommand extends ChainedCommand
{
  // ...

  private function handleLoadNote(event:LoadNoteEvent):void
  {
    ModelLocator.getInstance().currentNote = event.note;
  }

  // ...
}


6. 更新视图

Ml定到ModelLocator的currentNote成员的视N会自动更新来反映新的数据。NoteViewQ负责在~辑器中昄Note的组Ӟ是这L一个视图:
E序代码 E序代码
// NoteView.mxml
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:view="com.adobe.kiwi.notetag.view.*"
    xmlns="*">
  <mx:Script>
  <![CDATA[
    import com.adobe.kiwi.notetag.model.*;
    [Bindable] private var model:ModelLocator = ModelLocator.getInstance();
  ]]>
  </mx:Script>

  <view:NoteEdit id="noteEditor" width="100%" height="100%"
    note="{model.currentNote}" />

</mx:VBox>


所有的其它Ҏ(gu)——发布一个NoteQ获得一个SubscriptionQ更C个Task——会通过同样的Event-to-Command-to-Model-to-View途径来实现。Command-specific事g可以从多U内容中被分z,Q而不需要知道哪一个视图会被媄响。视囑֏以绑定到模型的变化而ƈ不需要知道引发的事g是从什么地方被分派的。由于松耦合Q出C更清z,更容易维护的代码?br />

]]>
?DataGrid 中分|C?/title><link>http://www.aygfsteel.com/19851985lili/articles/100450.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Sat, 24 Feb 2007 01:10:00 GMT</pubDate><guid>http://www.aygfsteel.com/19851985lili/articles/100450.html</guid><wfw:comment>http://www.aygfsteel.com/19851985lili/comments/100450.html</wfw:comment><comments>http://www.aygfsteel.com/19851985lili/articles/100450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/19851985lili/comments/commentRss/100450.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/19851985lili/services/trackbacks/100450.html</trackback:ping><description><![CDATA[<?xml version="1.0" encoding="utf-8"?><br /><mx:Application xmlns:mx="<a target="_blank">http://www.adobe.com/2006/mxml</a>" layout="vertical" creationComplete="initVars()" viewSourceURL="srcview/index.html"><br /><br /><mx:Script><br />        <![CDATA[<br />            import mx.rpc.events.ResultEvent;<br />            import mx.controls.Alert;<br />            import mx.collections.ArrayCollection;<br />            <br />        //holds all the records in the query returned by the CFC function     <br />        private var submissionsAllAryCol:ArrayCollection;<br />        <br />        //holds all the records in an Array<br />        //so we can use Array methods to <br />        //get a subset of the records for paging<br />        private var submissionsAllAry:Array;<br />        <br />        //The subset of the records for the current page<br />        private var submissionsSlicedAry:Array;<br />        <br />        //The subset of the records in the ArrayCollection<br />        //that is the dataprovider for the datagrid<br />        [Bindable]<br />        private var submissionsViewAryCol:ArrayCollection;<br />        <br />        [Bindable]<br />        private var start:int; //what record to start with on the current page<br />        <br />        private var increment:int ; //how many records to show per page<br />        <br />        [Bindable]<br />        private var end:int ; //what record (end-1) to end with on the current page<br />        <br />        [Bindable]<br />        private var total:int ; //how many total records<br />        <br />        <br />      <br />        <br />        // initialize the variables and get all submissions<br />        private function initVars():void {<br />            <br />            //initial start and end positions for slicing the Array<br />            start = 0;<br />            increment = 10; //how many records to display<br />            end = 0;<br />                    <br />           //Call the CFC method to get the submissions        <br />           myService.getAllSubmissions(139);<br />        <br />        }  //end function initVars()    <br />            <br />         /*Handles the result returned by calling the getAllSubmissions method<br />            of the CFC<br />            */<br />            public function handleQueryResult(event:ResultEvent):void{<br />                <br />                //place the query results into an ArrayCollection<br />                submissionsAllAryCol = event.result as ArrayCollection;<br />                <br />                //convert ArrayCollection to a standard Array<br />                //so we can use Array slice function<br />                submissionsAllAry = submissionsAllAryCol.toArray();<br />                <br />                //how many total submissions?<br />                total = submissionsAllAry.length;<br />                <br />                //determine initial value for end (cannot exceed total)<br />                <br />                if ( total < increment) {<br />                    <br />                    end = total;<br />                    <br />                } else {<br />                    <br />                    end = increment ;<br />                    <br />                }//end if<br />                <br />                <br />                //take out of the array records start to end (includes records from start to end-1)<br />                submissionsSlicedAry = submissionsAllAry.slice(start, end);<br />                <br />                //Create an ArrayCollection using the subset of our Array<br />                //and assign it to the data provider for the datagrid<br />                submissionsViewAryCol = new ArrayCollection( submissionsSlicedAry );<br />                <br />                //determine if Next button should be enabled<br />                //as its possible that the number or records returned<br />                //is less than our number per page (increment)<br />                nextBtn.enabled = isNextBtnEnabled();<br />                <br />                    <br />            } //end function<br />                <br />            /*Get the next increment of records for display in the datagrid<br />            */<br />            private function getNext():void {<br />                <br />                //going forward so <br />                //increase start and end by the increment<br />                <br />                start = start + increment ;<br />                end = end + increment ;<br />                <br />                //don't let the value of end be larger than the<br />                //total number of records<br />                if (end > total) {<br />                    <br />                    end = total;<br />                    <br />                }<br />                <br />                //create a subset of the Array that is holding all the submissions<br />                submissionsSlicedAry = submissionsAllAry.slice(start, end);<br />                <br />                //update the dataprovider for the datagrid<br />                submissionsViewAryCol = new ArrayCollection( submissionsSlicedAry );<br />                <br />                //determine if Next button should be enabled<br />                <br />                nextBtn.enabled = isNextBtnEnabled();<br />                <br />                //enable previous button<br />                //since we have gone to a next page of records<br />                previousBtn.enabled = true;<br />                <br />                <br />            }//end getNext<br />            <br />           <br />           /*Get the previous increment of records for display in the datagrid<br />           */<br />           private function getPrevious():void {<br />               <br />                 <br />                   //going backwards<br />                   end = start;<br />                <br />                //decrease start by the increment<br />                <br />                start = start - increment ;<br />                <br />                //create a subset of the Array that is holding all the submissions<br />                submissionsSlicedAry = submissionsAllAry.slice(start, end);<br />                <br />                //update the dataprovider for the datagrid<br />                submissionsViewAryCol = new ArrayCollection( submissionsSlicedAry );<br />                <br />                //determine if previous button should be enabled<br />                previousBtn.enabled = isPreviousBtnEnabled();<br />                <br />                //enable next button<br />                //since we have gone to a previous page of records<br />                nextBtn.enabled = true;<br />                <br />                <br />            }//end getPrevious<br />            <br />            /*Return true if button should be enabled<br />            */<br />            private function isNextBtnEnabled():Boolean {<br />                <br />                var enableBtn:Boolean = false ;<br />                <br />                if ( end < total ) {<br />                    <br />                    enableBtn = true ;<br />                    <br />                }<br />                <br />                return enableBtn;<br />            <br />                <br />            }//end function isNextBtnEnabled<br />            <br />            <br />            /*Return true if button should be enabled<br />            */<br />            <br />            private function isPreviousBtnEnabled():Boolean {<br />                <br />                var enableBtn:Boolean = false ;<br />                <br />                if ( start >= increment ) {<br />                    <br />                    enableBtn = true ;<br />                    <br />                }<br />                <br />                return enableBtn;<br />                <br />                <br />                <br />            }//end function isNextBtnEnabled<br />            <br />            <br />        ]]><br /></mx:Script>            <br />            <br />    <!--setup connection to the CFC--><br />    <mx:RemoteObject<br />        id="myService"<br />        destination="ColdFusion"<br />        source="flex.pagingdatagrid.SubmissionsGateway" <br />        showBusyCursor="true"<br />        >  <br />            <mx:method name="getAllSubmissions" result="handleQueryResult(event)" <br />            fault="Alert.show(event.fault.message)"/><br />                <br />    </mx:RemoteObject> <br />    <br />    <!--setup user interface--><br />    <mx:Panel width="80%" height="80%" layout="vertical" title="Page Through The Submissions" <br />        horizontalAlign="center" verticalAlign="top"><br />        <br />        <mx:VBox width="100%" height="100%" verticalAlign="top" horizontalAlign="left"><br />        <br />        <mx:Label text="Use the Previous and Next buttons to Get More Submissions"/><br />        <br />        <mx:HBox width="100%"><br />            <br />            <!--this button's enable value will be changed by the getPrevious() and getNext functions--><br />            <mx:Button label="Previous" id="previousBtn" enabled="false" <br />                click="getPrevious()"/><br />                <br />            <mx:Spacer width="50%"/><br />            <br />            <!--must use start+1 since array elements start at array position 0--><br />            <mx:Label text="Viewing Submissions {start+1} - {end} of {total} Submissions" /><br />            <br />            <mx:Spacer width="50%"/><br />            <br />             <!--this button's enable value will be changed by the getPrevious() and getNext functions--><br />            <mx:Button label="Next" id="nextBtn" enabled="true"<br />                click="getNext()"/><br />            <br />        </mx:HBox><br />        <br />        <!--The dataProvider will be updated each time the user clicks the next and previous buttons-->    <br />        <mx:DataGrid width="100%" height="100%" id="submissionsDG" dataProvider="{submissionsViewAryCol}" <br />            fontFamily="Verdana" fontSize="10"><br />            <mx:columns><br />                <mx:DataGridColumn dataField="submissionid" width="80" headerText="Sub #"/><br />            <br />                <mx:DataGridColumn dataField="presenter" width="100" headerText="Main Presenter" /><br />                <br />                <mx:DataGridColumn dataField="title" width="220" headerText="Title" wordWrap="true"/><br />            </mx:columns><br />        </mx:DataGrid><br />            <br />        </mx:VBox><br />        <br />    </mx:Panel><br /><br />   <!--setup user interface--><br /></mx:Application><img src ="http://www.aygfsteel.com/19851985lili/aggbug/100450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-02-24 09:10 <a href="http://www.aygfsteel.com/19851985lili/articles/100450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 如何利用 google 查找 Flex E序 http://www.aygfsteel.com/19851985lili/articles/99131.html☜♥☞MengChuChen☜♥☞MengChuChenSat, 10 Feb 2007 06:01:00 GMThttp://www.aygfsteel.com/19851985lili/articles/99131.htmlhttp://www.aygfsteel.com/19851985lili/comments/99131.htmlhttp://www.aygfsteel.com/19851985lili/articles/99131.html#Feedback0http://www.aygfsteel.com/19851985lili/comments/commentRss/99131.htmlhttp://www.aygfsteel.com/19851985lili/services/trackbacks/99131.htmlҎ(gu)Q源代码分ؓ mxml ?asQ?mxml 文g中肯定包?<mx:Application xmlns:mx="http://www.macromedia.com/2006/mxml"> q句话,因此Q只要在搜烦框中搜烦“mx Application 2006 filetype:mxml”,所有的 Flex 2 代码一览无余。如果要?as 文g的话Q搜?"import mx filetype:as"Q这个却Ҏ(gu)扑ֈ一?as2 的文Ӟ中不...


]]>
Cairngormhttp://www.aygfsteel.com/19851985lili/articles/98837.html☜♥☞MengChuChen☜♥☞MengChuChenThu, 08 Feb 2007 10:00:00 GMThttp://www.aygfsteel.com/19851985lili/articles/98837.htmlhttp://www.aygfsteel.com/19851985lili/comments/98837.htmlhttp://www.aygfsteel.com/19851985lili/articles/98837.html#Feedback0http://www.aygfsteel.com/19851985lili/comments/commentRss/98837.htmlhttp://www.aygfsteel.com/19851985lili/services/trackbacks/98837.html Cairngorm主要是对开发Flex应用E序应用了一pd的设计模式,从而开发出来FlexE序可扩展性,可维护性都大大提高。其工作程很清晎ͼ

1.Front Controller Listens for User Gestures
前端的控件监听用L行ؓ。注意它只是监听Qƈ不会做Q何反应?br />
2.Commands Do All the Work
控g监听以后调用Commands来做相应的事情,Command做了所有工作?br />
3.Delegate Server-Side Business Logic to Business Delegates
把服务器端的业务逻辑委托?Bussiness Delegates中。因为很多时候command需要获得服务器端数据,所以这样一来它可以直接调用Bussiness Delegates而不用关注如何连接数据的l节Q实C信息隐藏?br />
4.Business Delegate Finds Services with the Service Locator
Command调用Business Delegate 后,Business Delegate 通过Service Locator来找到相应的RPC servicesQ然后执行实C服务器端取数据?br />
5.Transfer Data as Value Objects
把传输过来的数据存储为Value Objects。这点大家应该都很熟(zhn),比如惌查询一个公告,必定创Z个公告类Q来存储每一个公告的标题{信息?br />
6.Store State in the Model Locator and Let Model Notify View
在Model Locator 保存状态ƈ且能使Model到View的变化。这样一来用h作就能直接媄响ModelQ比如添加物品到购物车,Model中的购物商品׃自动增加?br />

]]>
Z么要选择Cairngorm开发框Ӟhttp://www.aygfsteel.com/19851985lili/articles/98310.html☜♥☞MengChuChen☜♥☞MengChuChenTue, 06 Feb 2007 06:55:00 GMThttp://www.aygfsteel.com/19851985lili/articles/98310.htmlhttp://www.aygfsteel.com/19851985lili/comments/98310.htmlhttp://www.aygfsteel.com/19851985lili/articles/98310.html#Feedback0http://www.aygfsteel.com/19851985lili/comments/commentRss/98310.htmlhttp://www.aygfsteel.com/19851985lili/services/trackbacks/98310.html

我是一个JAVA EE开发h员,从业已经有近七、八q的旉了。对JavaEE的企业用户开发技术框架方面的比较熟?zhn)。对SpringQStrutsQWebworkQHibernate{流行的开源框架也一直在工作中用?/p>

在现在的MVC框架中,我比较們֐于采用WebWorkQ灵z轻巧Struts2其实质就是对WebWork2的一ơ升U,q也说明了WebWork相对与Struts1的优势所在。在现在的RIA开发成势之后,在工作中也用了DWR做Ajax服务器端的数据处理,q用js template的脚本处理页面显C数据,其中最大的痛苦是调试JavaScriptQ尽我们用了firefox的插件调试javascrpt?/p>

正如?a title="ria" target="_blank">JAVAE序员当如何选择RIA开发环?/a>”所提到ajax的的先天~陷Qƈ不适合RIA的全应用开发,如果只是在页面中的局部用是有一些优势,Ҏ(gu)具体情况选择最合适的?/p>

在Flex的应用程序开发当中,学习了很对范例,基本上浏览了一遍Flex的帮助文档,q自己做了些程序?/p>

其中遇到最大的困难不是在程序调试方面,而且E序理斚w的,代码混ؕQ难以控Ӟ其在多人开发的时候,更加Ҏ(gu)出现q样的情c这L情况下RIA的开发是痛苦的,不适宜的?/p>

Cairngorm开发框架说白了是一个FLEX应用开发的MVC框架Q自q感觉Q。将ModelQviewQControl独立分开Q清晰明了?br />
什么是CairngormQ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">Cairngorm是一个通过逻辑功能、数据、用戯囑֒代码控制的Q何事情来划分你的应用E序代码的基Ҏ(gu)论,可以叫做MVCQModel-View-ControlQ的一U实跉|式?/p>

Cairngorm的划?/strong>
Model LocatorQ模型定位器Q:存储你的应用中所有的Value ObjectsQ数据)和共享变量在一个位|。和Http的Session对象cMQ只是它存储在Flex接口的客L而不是在中间件应用服务器的服务器端?/p>

ViewQ界面)Q?/strong>通过一个或者多个FlexlgQ按钮、面ѝ组合框、Tile{等Q组合在一L一个个命名单元Q绑定数据在Model LocatorQ模型定位器Q中Qƈ且生基于用h作(点击、滚动、拖拽等Q的自定义的Cairngorm事g?/p>

Front ControllerQ前端控制器Q:接收Cairngorm事gq映他们到Cairngorm命o控制器上?/p>

CommandQ命令控制器Q:处理商业逻辑Q调用Caringorm代理和(或)其它命o?/p>

DelegateQ代理)Q?/strong>由命令创建,实例化远E过E调用(HTTP、Web Service{等Qƈ且处理命令的q回l果数据?/p>

ServiceQ服务)Q?/strong>定义q接q程数据存储的远E过E调用(HTTP、Web Service{等Q?br />

有关Cairngorm的资料:/P>

Cairngorm 是Iteration::two的开源项? 是用macromedia Flex的RIA开发的最?br />实践(best-practice)框架.
?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">Cairngorm基础上开发RIA, 会在Iteration::two的专家体pd现有的灵zdl?br />护企业解x案中辑ֈq.
Cairngorm本nq不是一个完整的企业应用, 它只是提供了一个开发的骨架, Iteration::twoU?br />之ؓ体系.
在这个体pM包括以下几个部分:
1. Business(业务逻辑部分)
2. Command(命o部分)
3. Control(控制部分)
4. Model(数据模型)
5. View(界面视图)
6. VO(ValueObject)

我们从Control说v:
在Control? 定义?个基c? Event, EventBroadcaster, FrontController.
Event用于在应用不同的层之间传递事? q携带事件的数据. 包含type和data两个
成员.
type存放一个区别不同事件的名称,会在FrontController中进行注?
而在命o(Command)cM, 会对事gq行响应.

EventBroadcaster是一个单例类(singleton), 用于q播用户动作对应的事? 使用
Ҏ(gu): EventBroadcaster.getInstance().broadcastEvent( ... )

FrontControllerE微复杂一点点. 用于特定的用户动作分发到指定的命oc? 
FrontConroller是请求处理的核心c? 整个体系中遍布的EventBroadcaster.getInstance(
).broadcastEvent( ... )q样的调?
都是用来通知监听控制? 用户发出了请? 在实际应用中, 开发者应该生成一?br />FrontContoller的子c?
q在构造函C调用addCommand()注册预期事g的处理命? FrontController的具
体实现类应该创徏一ơ而且只能创徏一?



http://cairngormdocs.org/

http://labs.adobe.com/wiki/index.php/Cairngorm



]]>
վ֩ģ壺 | | | º| | | 㽭ʡ| | | Ժ| | | Ͱ| ҵ| | | Ž| Dz| | | | ˮ| կ| | ƽ| | | ԭ| ʯ| | »| ˳| | | ˶| | ƽ| | | ܱ| ̨|