頁面跳轉
頁面跳轉可以是打開新的一頁,也可以是當前頁重定向,還可以是跳轉到當前頁的某個狀態,下面會從打開w文件,打開其它后綴文件,使用路由等幾個方面分別介紹一下在X5中的頁面跳轉。
目錄
1、打開w文件
1.1、使用彈出窗口打開
1.2、使用門戶提供的方法
1.3、模擬門戶的做法
2、打開html等其它類型的文件
2.1、使用打開w文件的方法
2.2、使用a鏈接跳轉
2.3、頁面重定向
2.4、使用window.open
3、使用路由
3.1、使用系統定義好的路由
3.2、自定義路由
3.3、使用靜態路由
1、打開w文件
1.1、使用彈出窗口打開
這是打開w文件最簡單的方法
父頁面——放windowDialog組件,調用windowDialog組件的open方法打開子頁面
子頁面——放windowReceiver組件,調用windowReceiver組件的windowEnsure或者windowCancel方法關閉子頁面
?
1、子頁面固定,不用傳參數
在設計器中設置windowDialog組件的src屬性為一個w文件的路徑,點擊按鈕打開時,可以在按鈕的onClick事件中選擇windowDialog組件的open操作。不使用按鈕打開,可以調用windowDialog組件的open方法
Model.prototype.openBtnClick = function(event){
this.comp('windowDialog1').open();
};
2、子頁面固定,需要傳參數
在設計器中設置windowDialog組件的src屬性為一個w文件的路徑,調用windowDialog組件的open方法時傳參
在父頁面中向子頁面傳兩個參數,一個是a,一個是b,a的值是123,b的值是456
Model.prototype.openBtnClick = function(event){
? ? this.comp('windowDialog1').open({data:{a:'123',b:'456'}});
};
在子頁面的windowReceiver組件的onReceive事件中接收父頁面傳過來的參數a和b
Model.prototype.windowReceiverReceive = function(event){
? ? alert(event.data.a);
? ? alert(event.data.b);
};
3、子頁面不固定
在調用windowDialog組件的open方法時,給出要打開的子頁面的路徑
Model.prototype.openBtnClick = function(event){
? ? var url = require.toUrl('$UI/comp/list.w');
? ? this.comp('windowDialog1').open({src:url,data:{a:'123',b:'456'}});
};
?
1.2、使用門戶提供的方法
使用X5提供的門戶,就可以使用這種方法。
父頁面——調用justep.Portal.openWindow方法打開子頁面
子頁面——調用justep.Portal.closeWindow方法關閉子頁面
?
1、在WeX5中使用
在父頁面中打開子頁面
Model.prototype.openBtnClick = function(event){
? ? var url = '$UI/comp/contents.w';
? ? justep.Portal.openWindow(url);
};
關閉子頁面,返回父頁面
Model.prototype.closeBtnClick = function(event){
? ? justep.Portal.closeWindow();
};
2、在BeX5中使用
在父頁面中打開子頁面,title、process、activity都是必須傳的,title是門戶中顯示的標題,process和activity是w文件的權限參數,可以從應用的config目錄下的function.xml文件中獲取,process是流程路徑,activity是流程環節。
Model.prototype.openBtnClick = function(event){
? ? var url = "$UI/erp/buy/process/goods/mainActivity.w";
? ? justep.Portal.openWindow(url, {
? ? ? ? title : '功能標題',
? ? ? ? process : "/erp/buy/process/goods/goodsProcess",
? ? ? ? activity : "mainActivity"
? ? });
};
關閉子頁面,返回父頁面
Model.prototype.closeBtnClick = function(event){
? ? justep.Portal.closeWindow();
};
3、傳參和接收參數
在url中加入a和b兩個參數
1
var url = '$UI/comp/contents.w?a=123&b=456';
在子頁面的w文件的model組件的onload事件中接收參數
Model.prototype.modelLoad = function(event){
? ? alert(this.getContext().getRequestParameter('a'));
? ? alert(this.getContext().getRequestParameter('b'));
};
1.3、模擬門戶的做法
沒有使用X5提供的門戶,就可以使用這種方法。
父頁面——放Contents組件,調用系統提供的loadContent方法,新增一個content,在content中創建一個WIndowContainer組件,設置src屬性為子頁面的w文件的路徑,即可打開子頁面
子頁面——調用Contents組件的remove方法關閉子頁面
案例:
在父頁面中打開子頁面,使用系統提供的loadContent方法,
var utils = require("$UI/system/components/justep/common/utils");
?
Model.prototype.openBtnClick = function(event){
? ? //生成一個唯一編碼,作為新建的content的xid
? ? var xid = justep.UUID.createUUID();
? ? //新建一個content,新建一個WIndowContainer,加載w文件
? ? utils.loadContent(this.comp("contents"), xid, require.toUrl("$UI/comp/list.w"));
? ? //切換到新建的content
? ? this.comp('contents').to(xid);
};
關閉子頁面,返回父頁面。在WIndowContainer嵌入的w文件中,使用this.getParent()獲得父頁面的model對象,就可以取得父頁面中的contents組件,刪除當前content。這樣寫要求子頁面知曉父頁面的組件,實際中可以在父頁面中提供一個方法,供子頁面調用。
Model.prototype.closeBtnClick = function(event){
? ? var pages = this.getParent().comp('contents')
? ? pages.remove(pages.active);
};
傳參和接收參數的方法同上
2、打開html等其它類型的文件
2.1、使用打開w文件的方法
一里面介紹的方法都是打開w文件的,但是,我們可以用它打開非w文件,具體的做法是新建一個w文件,放iframe標簽,設置src屬性為要打開的文件的路徑,這樣,打開非w文件就變成打開w文件了。
2.2、使用a鏈接跳轉
頁面中放a標簽,設置href屬性,通過點擊a標簽跳轉頁面
案例:
<a xid="a1" href="http://www.baidu.com">頁面跳轉</a>
非w文件接收參數的方法和w文件接收參數的方法不同,如果使用了html5,可以使用html5提供的本地存儲localStorage
賦值——localStorage.setItem(‘newsid’, ‘123’);
取值——var newsid= localStorage.getItem(‘newsid’);
2.3、頁面重定向
通過設置window.location.href實現頁面跳轉
案例:
Model.prototype.openBtnClick = function(event){
? ? ?window.location.href = "http://www.baidu.com";
};
2.4、使用window.open
調用window.open打開頁面
1、在手機App中使用
下面的代碼來自/UI2/demo/device/camera/mainActivity.js,如果是蘋果手機,在新打開的頁面中會顯示關閉按鈕,安卓手機可以使用返回鍵關閉
//顯示圖片和視頻
Model.prototype.fileListClick = function(event) {
? ? var data = this.comp("fileData");
? ? var url = data.getValue("filePath");
?
? ? if (justep.Browser.isX5App && justep.Browser.isAndroid) {
? ? ? ? window.open(url,"_system");
? ? } else {
? ? ? ? window.open(url, '_blank', 'toolbarposition=top,location=no,enableViewportScale=yes');
? ? }
};
2、在瀏覽器中使用
Model.prototype.openBtnClick = function(event){
? ? ?window.open("http://www.baidu.com");
};
3、使用路由
Router是一種根據不同URL表現不同頁面狀態的能力,提供對瀏覽器的前進、后退導航、有狀態的書簽、可分享的URL、URL自定義處理器等。能夠實現把這個有狀態的URL分享出去,打開這個URL后這個頁面能定位到相應狀態。這就是前端路由,雖然URL變化了,但是并沒有發送后端請求。
3.1、使用系統定義好的路由
1、contents組件支持路由
設置contents組件的routable屬性為true,contents組件就可以使用路由功能了。
當你切換content時,你會發現URL變化了。
http://127.0.0.1:8080/x5/UI2/comp/contents.w#!content1
http://127.0.0.1:8080/x5/UI2/comp/contents.w#!content2
http://127.0.0.1:8080/x5/UI2/comp/contents.w#!content3
這就是路由產生的效果,使得單頁應用內的頁面有了URL,這樣的URL即可以分享出去,也可以使用傳統方式打開。在瀏覽器里面直接打開上面的這三個URL會分別顯示contents的第一頁、第二頁、第三頁,這就是前端路由的效果。
2、windowDialog組件支持路由
設置windowDialog組件的routable屬性為true,windowDialog組件就可以使用路由功能了。
當你打開windowDialog時,你會發現URL變化了。
http://127.0.0.1:8080/x5/UI2/comp/windowDialog.w#!windowDialog1
http://127.0.0.1:8080/x5/UI2/comp/windowDialog.w#!windowDialog1//{“data”:{“a”:”123″,”b”:”456″}}
第一個URL是沒有參數的,第二個URL是帶著參數的。如果在瀏覽器里面直接打開上面的這兩個URL會首先打開w文件,然后彈出其中的彈出窗口,第二個URL還會傳參數給彈出窗口
3.2、自定義路由
系統的門戶中內置了路由,因此可以把任意一頁分享出去。如果自定義門戶,就需要使用路由組件,才能使得在自定義門戶中打開的功能有URL,從而實現分享。
下面我們具體說明一下自定義門戶中路由的實現
1、門戶頁的設置
在門戶頁中放contents組件,router組件。
contents組件的routable屬性設置為true;
2、在門戶頁中顯示功能樹
(1)將功能樹信息存入data組件
功能樹需要以下信息:功能名稱、功能URL、功能標識。如下圖
(2)用list和output組件顯示功能樹
放list組件,用來顯示功能樹
在li中放output組件,用來顯示功能名稱
(3)在list組件的單擊事件中打開功能并添加路由
//在上面需要引用一個js文件,下面調用這個js文件里面的方法
var utils = require("$UI/system/components/justep/common/utils");
?
Model.prototype.list1Click = function(event) {
? ? //獲得功能URL
? ? var funcUrl = this.comp('funcData').getValue('funcUrl');
? ? //獲得功能標識
? ? var funcID = this.comp('funcData').getValue('funcID');
? ? //調用系統提供的方法,在contents組件中新建content頁,新建WIndowContainer組件,顯示w文件,
? ? //第一個參數是contents組件的js對象,第二個參數是新建content組件的xid,我們用功能標識作為content的xid,第三個參數是要顯示的w文件的URL
? ? utils.loadContent(this.comp("contents1"), funcID, require.toUrl(funcUrl));
? ? //切換到新建的content頁
? ? this.comp("contents1").to(funcID);
? ? //添加路由,這兩個參數在下面的路由變動事件中會用到,下面再講
? ? this.comp("router1").addRouteItem('open', funcID);
};
現在,我們可以運行,并且打開一個功能了。看看瀏覽器地址欄里面的URL已經變了。例如:http://127.0.0.1:8080/x5/UI2/comp/contents.w#!router1/open/list/!/list
3、打開已分享的頁面
(1)路由URL介紹
http://127.0.0.1:8080/x5/UI2/comp/contents.w#!content3
http://127.0.0.1:8080/x5/UI2/comp/windowDialog.w#!windowDialog1//{“data”:{“a”:”123″,”b”:”456″}}
路由URL以#!開始,由三段數據組成,具體格式是:路由組件的xid/動作名稱/參數。上面例子中的第二個URL省略了動作名稱,因為windowDialog只有一個open的動作。上面例子中的第一個URL省略了后面兩個參數,因為content只有一個動作就是切換,且沒有參數,如果路由組件xid改為contents組件,可以這樣寫contents/page/3,表示切換到第三頁。
使用路由組件后,動作名稱和參數可以自定義,在路由變動事件中寫代碼接收、處理。本例中,我們打開功能設置的URL是:路由組件的xid/open/功能標識。例如:#!router1/open/list。這是由this.comp(“router1″).addRouteItem(‘open’, funcID);代碼生成的。
在瀏覽器的地址欄里面直接打開這個地址http://127.0.0.1:8080/x5/UI2/comp/contents.w#!router1/open/list/!/list的過程是這樣的:
contents.w——首先打開contents.w頁面,此時這個頁面里面沒有打開過任何功能
#!router1/open/list——系統會將router1/open/list傳給router組件,并觸發路由變動事件,在事件中,我們需要寫代碼創建content(xid為list),根據功能標識,加載對應功能頁面。
!/list——系統將contents組件切換到xid為list的content頁,就是我們在路由變動事件中新建的content頁。
至此,功能頁面就顯示出來了。
(2)在路由變動事件中接收URL中的信息
Model.prototype.router1Route = function(event) {
? ? //event.name是動作名稱,event.routeState有三種狀態:進入、變更、離開,在這里我們使用進入
? ? if (event.name == 'open' && event.routeState == 'enter') {
? ? ? ? //使用異步,因為瀏覽器加載頁面就是異步模式
? ? ? ? event.async = true;
? ? ? ? //event.param是功能標識
? ? ? ? var funcID = event.param;
? ? ? ? //通過功能標識找到功能URL
? ? ? ? var rows = this.comp("funcData").find([ 'funcID' ], [ funcID ], true, true, true);
? ? ? ? if (rows.length > 0) {
? ? ? ? ? ? var funcUrl = rows[0].val('funcUrl');
? ? ? ? ? ? //調用系統提供的方法,新建content,新建WIndowContainer,顯示功能
? ? ? ? ? ? utils.loadContent(this.comp("contents1"), funcID, require.toUrl(funcUrl), function(err) {
? ? ? ? ? ? ? ? if (!err) {
? ? ? ? ? ? ? ? ? ? //在loadContent方法的回調事件中,結束異步處理
? ? ? ? ? ? ? ? ? ? event.dtd.resolve();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? });
? ? ? ? }
? ? }
};
3.3、使用靜態路由
上面自定義路由中介紹了,使用動態路由的方法,下面介紹使用靜態路由的方法——使用a標簽,設置href為路由URL,例如:
?去第一頁
?去第二頁
這是使用路由的簡單方式
- 快速入門
- 第一個應用
- WeX5產品能力和技術
- wex5技術理念
- WeX5可以怎么玩?
- WeX5和BeX5比較
- UI2開發
- UI2前端框架基礎01:應用和頁面
- UI2框架基礎02:框架結構圖和目錄
- 組建基礎
- 編程基礎
- js引用
- css、text引用
- 設置資源依賴
- 代碼調試
- 數據組件
- Data組件基礎01:列、初始化加載狀態、行對象和游標
- Data組件基礎02:規則、數據遍歷查找
- Data組件基礎03:CRUD
- Data組件基礎04:Tree、主從數據、更新模式
- Data組件基礎05:再談Data組件新增,查詢,保存
- Data組件的JSON數據格式
- WeX5 & BeX5 頁面框架核心之數據綁定
- 數據綁定屬性系列
- 初識綁定
- visible綁定
- text綁定
- html綁定
- css綁定
- 頁面布局
- 頁面樣式
- 樣式基礎
- 添加自定義圖標(iconfont)
- 常用組件
- bar組件
- contents組件
- 前端路由和頁面跳轉
- 路由模塊
- 頁面跳轉
- 部署和發布
- 三種部署方式
- Web app部署
- UIServer的緩存機制
- 自定義組件開發
- 組件運行時開發案例
- 組件設計時開發案例
- 組件設計時開發參考
- 屬性編輯器配置和開發
- 自定義向導開發(waiting)
- 第三方庫集成
- 集成Echarts
- 集成百度和高德地圖
- App開發
- 打包
- App打包基礎和常見問題
- App打包原理和目錄結構
- App打包過程詳解
- App打包服務器環境搭建
- 蘋果證書申請 使用
- Android和IOS的本地應用圖標規范
- Android和IOS的本地App如何安裝(apk&ipa)
- 蘋果App部署HTTPS進行在線下載安裝
- 調試
- Android和IOS真機調試
- 插件
- 如何使用和擴展cordova插件
- cordova插件開發
- 常用cordovar插件
- SQLite插件
- 極光推送(JPush)插件
- 微信支付入門教程
- 微信、支付寶支付開發
- 服務端開發
- App與服務端交互原理
- 輕量級Baas(視頻)(文字) (.net版)
- Data組件的JSON數據格式11
- 微信服務號集成(視頻)
- 擴展學習資料
- bootstrap
- Knockoutjs
- JQuery
- requirejs
- phonegap/cordova