在詳細敘述解決問題的方法之前,讓我們看下slide item在list中的位置?它和list、item以及item options的關系?
結構
slide item首先存在于一個列表中,所以它的父親是一個ion-list。
ion-list包含ion-item-sliding。
ion-item-sliding又包含ion-item(用于顯示列表內容)和ion-item-options(用于顯示滑動處理的選項)
我們這邊講的slide item是指ion-item-sliding。
具體的html的用法可以參考官方文檔。
下面通過怎么解決“手動打開Slide Item”的問題來對Ionic2的slide item的源碼學習。
怎么手動打開Slide Item
目前左滑可以打開slide item,那么如果通過點擊一個button,是否也可以打開slide item呢?
查看了slide item的文檔,看到只有slidingItem.close()接口,并沒有open接口。
那么看來Ionic2只提供手動關閉slide item的API,沒有手動打開slide item的API。

為什么會這樣呢?我想只有編寫者才知道了。。。
之前沒有習慣看框架的源碼,其實大部分是框架封裝的不錯,似乎不需要看源代碼,那么就可以拿到想要的;而有的源碼看的一頭霧水,能力不及所致。

但是當你在網上搜索太多根本無果,那么也只能硬著頭皮看看源碼吧,看了發(fā)現并沒有那么難,也許自己也沒有那么菜,嘿嘿,夸獎一下自己。
最重要的是不僅可以找到直接的解決方法,也可以從別人的代碼中學習編碼的方式,受益多多。
下面總結了三種解決的方法:
1. 在源代碼中增加一個open的接口
下面是源碼中的close接口
close(){
this._setOpenAmount(0,true);
}
增加一個open接口
open(){
this._setOpenAmount(1,true);
}
好處是簡單。缺點是直接修改框架源代碼肯定不是一個好的解決方法,而且對于這種更新比較快的框架來說,以后的升級和維護中會比較麻煩。
那就看看第二種方法。
2. 直接用css暴力打開
采用css的方式給ion-item以及slide item加入相應的樣式去打開。
下面是相應的代碼。
其中item就是結構中所說的ion-item, slideItem就是結構中所說的ion-item-sliding。
let coord = pointerCoord(event); //獲取點擊的起點位置
slideItem.startSliding(coord.x);
let openAmount = this.slideItem._rightOptions.width();
item.setElementStyle("transition", '');
slideItem.setElementClass('active-sliding', true);
slideItem.setElementClass('active-slide', true);
slideItem.setElementClass('active-options-right', true);
item.setElementStyle("transform",
`translate3d(${-openAmount}px,0,0)`);
此方法可以打開,可以實現相應的功能。但是帶來的問題是,有一些手機,特別是小米的某些手機,無法正常關閉slide item,是瀏覽器不兼容的問題,所以如果使用這樣的方式,我們需要把超級大麻煩“瀏覽器兼容”的問題引進來。
其實Ionic2框架很重要的一點是幫你做了相關的瀏覽器兼容性的處理。
那么我們?yōu)槭裁从忠匦伦鲆槐槟兀?/p>
所以就想到了第三種方法,深入看源碼,是否可以模擬手指滑動的過程呢?
模擬手指滑動的過程
通過進一步查看ion-slide-item的源碼,發(fā)現有一些public的方法:
startSliding
moveSliding
endSliding
這些接口被item-sliding-gesture.js調用,原來slide item還有一個gesture用來管理它。
那么下面就是通過測試的模擬過程:
letcoord=pointerCoord(event),
firstCoordX=coord.x,
firstTimestamp=Date.now(),
step=50,
moveCoordX1=firstCoordX-step,
moveCoordX2=moveCoordX1-step,
endCoordX=moveCoordX2-step,
deltaX=endCoordX-firstCoordX,
deltaT=1;
this.slideItem.startSliding(firstCoordX);
this.slideItem.moveSliding(moveCoordX1);
this.slideItem.moveSliding(moveCoordX2);
deltaT=(Date.now()-firstTimestamp);
this.slideItem.endSliding(deltaX/deltaT);
代碼的詳細解釋主要是確認手指開始、移動、結束的點擊位置,當然還有一些其他的參數,這里重點說一下時間這個參數,其他的參數可以參考源碼。

為什么需要計算時間?
這里我們采用快速滑動的理論來直接打開slide item。
時間滑動思想
如果是慢一點的滑動時,滑動多大的寬度slide-item-option就出來多大的寬度,如果超過一半停止滑動會直接打開slide item,如果沒有超過一半就停止滑動那么slide item會關閉;
這個大家可以通過滑動list來做實驗。
因為我們是模擬,所以會根據這個思想會構造相應的參數,否則沒辦法成功的哦。
這也是為什么moveSliding并不需要隔幾秒執(zhí)行,我們是模擬的快速滑動。
為什么是一個start動作、兩次move動作,一次end動作
看了源碼就發(fā)現必須是一個start動作,至少兩次的move動作,一次end動作
起始肯定是需要的,但是move的動作至少是兩個,看了源碼會知道中間會計算一些值,有些事在第一次move的時候計算的,有些是第二次move的時候計算的,而這些值在end的時候會進行計算。
更多細節(jié)部分參見它官方的源碼。
源碼下載https://github.com/ionic-team/ionic。