最近在用MUI開發這個APP,發現有時候這個plusready不起作用,表現在,這個頁面如果重復打開,這個plusready就進不去,然后上一個頁面傳過來的值,就沒法接收了。這個經過MUI官方確認,是有可能發生的,所以,這里面的話,就需要通過自定義事件,來確保這個值能正確傳遞。
首先,我先演示一下,通常我們頁面之間的傳值的方法,如下:
參數生成頁面:
mui.openWindow({
id: 'lightMapMain.html',
url: 'lightMapMain.html',
show: {
aniShow: 'pop-in'
},
extras: {//
extras里面的就是參數了
entrance: "mapDetail",
ProjectName:
"工程名稱"
},
waiting: {
autoShow: true, //自動顯示等待框,默認為true
}
});
參數接收頁面:
//plusReady事件后,在里面接收參數
mui.plusReady(function() {
var wv = plus.webview.currentWebview();
var vText = wv.ProjectName;//這樣就能接收到上個頁面傳過來的值了
document.getElementById("lbProjectName").innerHTML = vText;
});
通常我們傳參就這么進行,但是由於這個頁面,多次打開,發生了類似緩存的現象,所以,有時候這個plusReady不能保證每次都能執行。所以,我根據而官方的提示,增加了一個自定義事件,來實現這個情況,實現方法如下(我是雙管齊下,plusReady也獲取值,自定義事件也獲取值)
好,下面演示我的方法(下面這個監聽一個按鈕,然后打開一個頁面):
var vBtnCtrl = document.getElementById("btnCtrl");
vBtnCtrl.addEventListener("tap", function() {
var
vNextPage = null;
//獲得下一個頁面
if (vNextPage == null) {
vNextPage = plus.webview.getWebviewById('lightMapMain.html');//這個是下一個頁面的ID,第一次,他肯定為空,所以,這里面這個fire方法,是不會執行的。
if (vNextPage != null) {
//觸發下一個頁面的自定義事件
mui.fire(vNextPage, 'DIY_DATA', {
entrance: 'mapDetail',
ProjectName: vText
});
}
}
var vCurrentWebView = plus.webview.currentWebview();
if (vCurrentWebView != null) {
vCurrentWebView.hide('none');
}
//上面這個代碼是隱藏當前窗口,我這個是浮動的子窗口,到了下一個頁面之后,我要把它隱藏起來,否則等下我返回,這個子窗口還在,就影響體驗了。如果你們是整個頁面的窗口,那么這個代碼可以注釋掉。
mui.openWindow({
id: 'lightMapMain.html',//這個ID與上面的自定義事件傳參的ID需要一致,因為第一次打開這個頁面,上面是獲取不到webview的,但是,你這次打開之后,下次再回到這個頁面的時候,由於我們之前打開過這個頁面,所以,那個自定義事件就會觸發了。
url: 'lightMapMain.html',
show: {
aniShow: 'pop-in'
},
extras: {//這里面是傳參了,想我們前面說到的
entrance: "mapDetail",
ProjectName: vText
},
waiting: {
autoShow: true, //自動顯示等待框,默認為true
}
});
})
接下來,我們就到了參數接收頁面,如下(首先,我們還是要在plusReady里面接收一次,因為你不能保證這次是初次打開這個頁面還是第二次,所以,這個還是需要的。):
//plusReady事件后,自動創建menu窗口;
mui.plusReady(function() {
var wv = plus.webview.currentWebview();
var vText = wv.ProjectName;
document.getElementById("lbProjectName").innerHTML = vText;
});
但是如果這個是非首次打開的話,就會不一定進來plusReady了,所以,參數可能接收失敗了,這里面,我們就要接收自定義事件傳過來的參數了,就是前面我們的fire那里了。
代碼如下:
//添加上一個頁面自定義事件監聽
window.addEventListener('DIY_DATA', function(event) {
//獲得事件參數
//`var id = event.detail.id;
var vText = event.detail.ProjectName;
document.getElementById("lbProjectName").innerHTML = vText;
});
這樣,我們就能把這個參數獲取到,雙重保證,就冇問題啦,是不是。(如果你們需要謹慎一些,可以把這個自定義事件的監聽延遲個300毫秒,保證接收的概率,因為如果是這個自定義事件優先執行了,然后他又去執行這個plusReady,那就會沖突了。所以,你們懂得。)
好了,本次教程到此結束,
轉載請保留原作者地址以及姓名(本人無償分享經驗,有償接單制作APP,有需要可以聯系我。);
作者:南宮蕭塵
E-mail:314791147@qq.com
日期:2016-04-03