MUI APP關於頁面之間的傳值,plusready和自定義事件


            最近在用MUI開發這個APP,發現有時候這個plusready不起作用,表現在,這個頁面如果重復打開,這個plusready就進不去,然后上一個頁面傳過來的值,就沒法接收了。這個經過MUI官方確認,是有可能發生的,所以,這里面的話,就需要通過自定義事件,來確保這個值能正確傳遞。

              首先,我先演示一下,通常我們頁面之間的傳值的方法,如下:
              參數生成頁面:
                mui.openWindow({
                    id'lightMapMain.html',
                    url'lightMapMain.html',
                    show{
                        aniShow'pop-in'
                    },
                    extras{// extras里面的就是參數了
                        entrance"mapDetail",
                        ProjectName "工程名稱"
                    },
                    waiting{
                        autoShowtrue//自動顯示等待框,默認為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',
                            ProjectNamevText
                        });
                    }
                }
                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",
                        ProjectNamevText
                    },
                    waiting{
                        autoShowtrue//自動顯示等待框,默認為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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM