從新排版後的文章連接:https://my.oschina.net/keysITer/blog/749208緩存
在項目中的日曆使用的是silideBox,可是最近在測試的時候發現一個框架BUG:框架
問題描述:ionic
若是在silideBox上使用緩存,那麼在進入另外一個state以後,打開一個Popover或者一個Modal,再返回原來的頁面,則slideBox的width變爲0,即看不見silideBox的內容了。ide
解決方案:oop
1.使用ng-if測試
即不使用緩存,可是這樣的弊端就是沒有緩存-.-。ui
2.使用$ionicSlideBoxDelegate.update()this
在每次進入頁面的時候執行此方法,會讓slideBox從新計算寬度和高度。判斷進入頁面的方法能夠是監聽$ionicView.enter或者$stateChangeSuccess,建議後者,其中封裝的有stateFrom、stateTo等方法方便判斷頁面的跳轉,而且反應較前者快不少。.net
3.修改ionic源碼(建議)blog
爲何說這個是ionic的框架bug,就是由於它的源碼寫的有缺陷,致使一些莫名其妙的問題。因此打開ionic.bundle.js查看它的源碼(只展現一開始的一部分):
ionic.views.Slider=ionic.views.View.inherit({
initialize:function(options){
varslider=this;
//utilities
varnoop=function(){};//simplenooperationfunction
varoffloadFn=function(fn){setTimeout(fn||noop,0);};//offloadafunctionsexecution
//checkbrowsercapabilities
varbrowser={
addEventListener:!!window.addEventListener,
touch:('ontouchstart'inwindow)||window.DocumentTouch&&documentinstanceofDocumentTouch,
transitions:(function(temp){
varprops=['transitionProperty','WebkitTransition','MozTransition','OTransition','msTransition'];
for(var i in props)if(temp.style[props[i]]!==undefined)returntrue;
return false;
})(document.createElement('swipe'))
};
var container=options.el;
//quitifnorootelement
if(!container)return;
var element=container.children[0];
var slides,slidePos,width,length;
options=options||{};
var index=parseInt(options.startSlide,10)||0;
var speed=options.speed||300;
options.continuous=options.continuous!==undefined?options.continuous:true;
function setup(){
//此爲添加的代碼
console.log('setup')
if(!container.offsetWidth){ return;
}
//此爲添加的代碼end
//cacheslides
slides=element.children;
length=slides.length;
閱讀源代碼後能夠發現,setup方法是slidebox的主方法,因此我在setup的方法裏面加了一個打印語句,看他在什麼時間會執行這個方法。
測試期間,發現每當popover或者modal打開的時候,這個方法都會執行兩次(緣由不明),代碼中:container返回的是整個slider的HTML代碼片斷,當他在頁面中可見的時候,它的可見寬度大於0,反之爲0,因此在咱們跳轉至其餘頁面的時候,它的可見寬度即變爲0,這個時候咱們只要阻止它改變當前的狀態便可,因此加上return,這樣問題就解決啦。
4.直接引入新的js,覆蓋原來的