移動端傳值問題——不同的場景對應着不同的傳遞方式
一、頁面預加載時進行傳值
1、mui.init()方法——向預加載頁面進行傳遞參數
通過mui.init()方法向預加載頁面進行傳值
mui.init({
preloadPages:[{
url:prelaod-page-url,
id:preload-page-id,
styles:{},
extras:{
name:'csdn'
},//在這里添加要傳遞的參數
...
},
...]
});
對應頁面接受參數,即傳過來的值
mui.plusReady(function(){
var self = plus.webview.currentWebview();
var name = self.name;//獲得參數
});
2、mui.preload()方法——向預加載頁面進行傳遞參數
通過mui.preload()向預加載頁面傳遞參數
var page = mui.preload({
url:new-page-url,
id:new-page-id,
styles:{},
extras:{
name:'csdn'
}//自定義擴展參數
});
對應頁面接受參數,即傳過來的值
mui.plusReady(function(){
var self = plus.webview.currentWebview();
var name = self.name;//獲得參數
});
二、頁面創建時進行傳值
首先要判斷此時的頁面是否被預加載過
如果頁面已經預加載過,這時候只會顯示此頁面,並不會創建,
這里傳遞的參數也不會被接收到,應該在頁面預加載的地方傳值。
如果頁面沒有被預加載過,每執行一次openWindow都會重新創建並打開頁面,這樣傳值有效。
1、mui.openWindow()——向頁面傳遞參數
mui.openWindow({
url:'info.html',
id:'info.html',
extras:{
name:'csdn'
}
});
對應頁面接受傳過來的參數
mui.plusReady(function(){
var self = plus.webview.currentWebview();
var name = self.name;//獲得參數
});
2、mui.init()——向子頁面傳遞參數
mui.init({
subpages:[{
url:your-subpage-url,
id:your-subpage-id,
styles:{},
extras:{}//在這里添加自定義參數
}]
});
對應頁面接收參數的方式
mui.plusReady(function(){
var self = plus.webview.currentWebview();
var name = self.name;//獲得參數
});
總結:一和二可以統一被認為是頁面初始化狀態時(不管是預加載還是頁面進行創建的時候,這個時候頁面都處於初始化狀態)
mui在初始化頁面時,提供了extras配置參數,通過該參數可以設置頁面參數,從而實現頁面間傳值。
mui框架在如下幾種場景下,會執行頁面初始化操作:
- 通過mui.openWindow()打開新頁面(若目標頁面為已預加載成功的頁面,則在openWindow方法中傳遞的extras參數無效);
- 通過mui.init()方法創建子頁面;
- 通過mui.init()方法預加載頁面;
- 通過mui.preload()方法預加載頁面
三、頁面已經打開,傳值(在已打開的頁面間傳值)
Webview窗口對象窗口對象WebviewObject有一個evalJS方法,
可以將JS腳本發送到Webview窗口中運行,可用於實現Webview窗口間的數據通訊。
mui.fire()方法——mui.fire(target, event, data)——自定義時間傳值
參數說明:
- target: Type: WebviewObject 需傳值的目標webview
- event:Type: String 自定義事件名稱
- data:Type: JSON json格式的數據
1、 一和二進行傳值的局限性:只能在頁面初始化的時候進行傳值
2、 當遇到以下一種情況時(列表詳情)
(1)詳情頁一般采用預加載模式
(2)如果希望點擊列表中某一項后,顯示並更新詳情頁
這個時候就不能運用一和二里面的傳遞參數的方式了;這時候就需要自定義事件了。
情景題:假定現在有一個列表頁list.html和一個詳情頁details.html
如果希望list給details傳遞一個名為”id”的自定義參數。
首先要知道怎樣在list中調用details頁面,在mui框架中,任意頁面都有一個id,這個id默認和url一樣,也可以自定義。
//App首頁打開列表頁
mui.openWindow({
url:'list.html',
id:'list'
});
//list頁面中預加載details頁面
mui.init({
preloadPages:[{
url:'details.html',
id:'details'
}]
});
var detailPage;
//點擊list中某一項時觸發details頁面的"update"事件
mui('ul.mui-table-view').on('tap','li',function(evt){
if(!detailPage){//獲得頁面
detailPage = plus.webview.getWebviewById('details');
}
mui.fire(detailPage,'update',{//觸發事件
id:this.getAttribute('data-guid');
});
detailPage.show('slide-in-right',300);//顯示詳情頁
});
//在details頁面接收id參數
window.addEventListener('update',function(event){
//獲得事件參數
var id = event.detail.id;
//根據id向服務器請求新聞詳情
.....
});
如果希望在詳情頁瀏覽完之后更新列表頁對應塊(比如更新閱讀次數),
也可以在詳情頁中觸發列表頁的事件,然后在列表頁監聽事件:
//details.html中觸發list的update事件
var list=plus.webview.getWebviewById('list');
mui.fire(list,'update',{//觸發自定義事件
id:'myid'
});
mui.webview.currentWebview().hide("auto", 300);//隱藏當前頁面
//list頁面中監聽事件
window.addEventListener('update',function(evt){
var id=evt.detail.id;
//do something
});
