浏览 2291 次
锁定老帖子 主题:Flex之DeepLink
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-02-29
换个角度说,在传统的基于页面流的方式我们可以通过http://imzw.iteye.com/blogs/165173导航到一个页面。但RIA的方式通常不行,也就是我们通常无法通过一个链接导航到程序的一个操作界面。Ajax,Flash等RIA技术都面临着这个问题。Ajax可通过JavaScript调用浏览器相关的对象实现。Flash相对要困难些。Flex中已经内建了DeepLink来解决这个问题。 DeepLink是通过锚点,即http://imzw.iteye.com/blogs/165173#view=0;showDetails=true这样一个链接导航到Flex应用程序某一操作界面。 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" historyManagementEnabled="false" layout="absolute" backgroundImage="{bgSource}" backgroundColor="#97A5E3" initialize="init()" > <mx:Script> <![CDATA[ import mx.events.BrowserChangeEvent; import mx.managers.IBrowserManager; import mx.managers.BrowserManager; import mx.utils.URLUtil; import mx.controls.Alert; import mx.collections.ArrayCollection; import mx.rpc.events.ResultEvent; [Bindable] [@Embed(source="assets/dog.jpg")] public var dog:Class; [Bindable] public var bgSource:String; public var browserManager:IBrowserManager; private function init():void{ initApp(); bgHttpService.send(); } private function initApp():void { browserManager = BrowserManager.getInstance(); browserManager.addEventListener(BrowserChangeEvent.BROWSER_URL_CHANGE, parseURL); browserManager.init("", "Dog"); } private var parsing:Boolean = false; private function parseURL(event:Event):void{ parsing = true; var o:Object = URLUtil.stringToObject(browserManager.fragment); if (o.view == undefined){ o.view = 0; } tn.selectedIndex = o.view; browserManager.setTitle((tn.selectedIndex == 0) ? "AnotherDog" : "Dog"); tn.validateNow(); var details:Boolean = o.details == true; if (tn.selectedIndex == 0){ shipDetails.selected = details; }else{ recvDetails.selected = details; } parsing = false; } private function updateURL():void{ if (!parsing) callLater(actuallyUpdateURL); } private function actuallyUpdateURL():void{ var o:Object = {}; var t:String = ""; if (tn.selectedIndex == 1){ t = "AnotherDog"; o.view = tn.selectedIndex; if (recvDetails.selected){ o.details = true; } }else{ t = "Dog"; o.view = tn.selectedIndex; if (shipDetails.selected){ o.details = true; } } var s:String = URLUtil.objectToString(o); browserManager.setFragment(s); browserManager.setTitle(t); } private function bgHandler(event:ResultEvent):void{ var bgData:ArrayCollection = event.result.backgrounds.image; // mx.controls.Alert.show("result"); var minBg:int = 0; var maxBg:int = bgData.length - 1; var range:int =maxBg - minBg; var bgIndex:int = Math.round(Math.random() * range) + minBg; bgSource ="assets/"+ bgData.getItemAt(bgIndex).path; } ]]> </mx:Script> <mx:HTTPService id="bgHttpService" url="assets/backgrounds.xml" showBusyCursor="true" method="get" fault="{Alert.show(event+'')}" result="{bgHandler(event)}" /> <mx:VBox width="100%" height="100%" horizontalAlign="right" verticalAlign="middle"> <!-- 当Tab Change更新URL--> <mx:TabNavigator id="tn" change="updateURL()"> <mx:Panel label="Dog"> <mx:Image id="img" width="400" height="300" source="{dog}" scaleContent="true" /> <!-- 当CheckBox Change更新URL--> <mx:CheckBox id="shipDetails" label="Show Details" change="updateURL()" /> </mx:Panel> <mx:Panel label="Another Dog"> <mx:Image id="img1" width="400" height="300" source="{dog}" scaleContent="true" /> <mx:CheckBox id="recvDetails" label="Show Details" change="updateURL()" /> </mx:Panel> </mx:TabNavigator> </mx:VBox> </mx:Application> 关键点: 1. 在Application中设置 historyManagementEnabled="false" ,因为Flex有些组件(eg:Tab)默认提供了DeepLink功能。 2. 调用BrowserManager.init() 在Application初始化的时候. 参数 "" 意思是 '#'后面什么都没有. 3. 在需要的地方更新地址栏URL。 4. 在Application初始化的时候调用 BrowserManager.addEventListener()监听浏览器的变化。 5. parseURL()解析URL导航到相应界面(更新的相应状态)。 你可以看这里http://www.mizhongwang.cn/flex-app/RandomBackgroundAndDeepLink/RandomBackgroundAndDeepLink.html PS:源码中还包含了动态显示不同的背景的代码。每次进入是背景是随机显示的,多刷新几次就能看出来,图片太少了。 --EOF-- 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |