Web應用中富交互的撤銷與前進設置的完成方法說明(代碼)
發(fā)表時間:2023-08-29 來源:明輝站整理相關軟件相關文章人氣:
[摘要]本篇文章給大家?guī)淼膬?nèi)容是關于Web應用中富交互的撤銷與前進操作的實現(xiàn)方法介紹(代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。在web應用中,用戶在進行一些富交互行為的操作時難免會出現(xiàn)誤操作,比如在富文本編輯器設置錯了字體顏色就需要撤回,做H5活動頁面的時候不小心刪了一個圖...
本篇文章給大家?guī)淼膬?nèi)容是關于Web應用中富交互的撤銷與前進操作的實現(xiàn)方法介紹(代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
在web應用中,用戶在進行一些富交互行為的操作時難免會出現(xiàn)誤操作,比如在富文本編輯器設置錯了字體顏色就需要撤回,做H5活動頁面的時候不小心刪了一個圖片也需要撤回,更比如在線設計原型圖應用的時候不小心刪了一個頁面等,總之在交互場景非常復雜的情況下,用戶操作失誤的可能性非常大,這時候‘撤銷’和‘前進’這兩個操作就很有必要了,而且用戶體驗也很好
思路
不管是任何場景下的web應用,用戶的每一次操作我們都可以看成是對某個組件或某個對象的狀態(tài)和屬性進行改變,一旦連續(xù)的動作操作完成正準備進行下一個動作之前,此刻的狀態(tài)就是一個全新的狀態(tài)
A —— B —— C
用戶未操作的時候全局狀態(tài)是A
用戶操作某個組件使其移動到位置X,松開鼠標之后全局狀態(tài)是B
用戶操作另一個組件使其刪除,完成后全局狀態(tài)是C
所以,撤銷的操作就是在用戶操作狀態(tài)到C的時候讓全局的狀態(tài)回到B,回到上一次操作完的時候。
那么就需要可以存放這種大量狀態(tài)的列表或索引來記錄每一次操作的動作
但如果我用某一個數(shù)組變量來存儲如此龐大的數(shù)據(jù)是不是略顯不妥?數(shù)據(jù)量越大內(nèi)存應該會爆吧?所以這里我推薦大家使用IndexedDB
下面是利用Angular、Rxjs和IndexedDB封裝好的一個服務類
import { Inject } from "@angular/core";
import { IndexedDBAngular } from "indexeddb-angular";
import { Subject, Observer, Observable } from "rxjs";
export interface IDBData {
widgetList: string
}
// 前進和后退的服務
@Inject({
providedIn: 'root'
})
export class PanelExtendMoveBackService {
/**
* 發(fā)射DB集合存儲的數(shù)據(jù),可訂閱
*/
public launchDBDataValue$: Subject<IDBData> = new Subject<IDBData>()
/**
* 創(chuàng)建一個叫panelDataDB的本地數(shù)據(jù)庫,版本號為1
*/
public db = new IndexedDBAngular('panelDataDB', 1)
/**
* 記錄前進和后退的存儲集合項的下標key
* 默認為0
*/
public dbCurrentIndex: number = 0
/**
* 自增的DBkey
*/
public dbKey: number = -1
// 是否允許前進
public get isMove() : boolean {
return this.dbCurrentIndex < this.dbKey
}
// 是否允許后退
public get isBack() : boolean {
return this.dbCurrentIndex > 0
}
constructor() {}
/**
* 創(chuàng)建DB集合
*/
public createCollections(): Observable<boolean> {
const _sub: Subject<boolean> = new Subject<boolean>()
this.dbKey = -1
this.db.createStore(1, (db: any) => {
db.currentTarget.result.createObjectStore('panelItem')
}).then(()=>{
this.dbClear()
_sub.next(true)
})
return _sub.asObservable()
}
/**
* 往集合里添加數(shù)據(jù)
* 同時把新添加的key賦值給dbCurrentIndex,
*/
public dbAdd(): void {
this.handleDbCurrentRefreshDB();
this.dbKey += 1;
// 此處存儲你要保存的數(shù)據(jù)
const _widget_list = []
this.db.add('panelItem', { widgetList: JSON.stringify(_widget_list) }, this.dbKey).then(
_e => {
if ((<Object>_e).hasOwnProperty('key')) {
this.dbCurrentIndex = _e.key
};
},
() => {
this.dbKey -= 1
throw new Error('添加panelItem集合失敗')
}
)
}
/**
* 在執(zhí)行添加數(shù)據(jù)集操作的時候判斷dbCurrentIndex當前指引的下標是否低于dbKey
* 如果是說明執(zhí)行了后退操作之后后續(xù)動作執(zhí)行了dbAdd的操作,則清空dbCurrentIndex索引之后的數(shù)據(jù)重新添加
*/
public handleDbCurrentRefreshDB(): void {
if (this.dbCurrentIndex < this.dbKey) {
for (let i = this.dbCurrentIndex + 1; i <= this.dbKey; i++) {
this.db.delete('panelItem', i).then(() => {})
}
this.dbKey = this.dbCurrentIndex
}
}
/**
* 執(zhí)行后退操作發(fā)射DB數(shù)據(jù)集
*/
public acquireBackDBData(): void {
if( this.isBack ) {
this.dbCurrentIndex -= 1
this.db.getByKey('panelItem', this.dbCurrentIndex).then(res=>{
this.launchDBDataValue$.next(res)
},()=>{ })
}
}
/**
* 執(zhí)行前進操作發(fā)射DB數(shù)據(jù)集
*/
public acquireMoveDBData(): void {
if( this.isMove ) {
this.dbCurrentIndex += 1
this.db.getByKey('panelItem', this.dbCurrentIndex).then(res => {
this.launchDBDataValue$.next(res)
}, () => { })
}
}
/**
* 清除DB集合panelItem
*/
public dbClear(): void {
this.db.clear('panelItem').then(_e => {})
}
}
這里我偷懶了一下,直接采用自增的id作為key了,也方便查找
每一次操作所存儲的數(shù)據(jù)如下
最后可以看一下我實現(xiàn)好了的撤銷和前進操作的場景
以上就是Web應用中富交互的撤銷與前進操作的實現(xiàn)方法介紹(代碼)的詳細內(nèi)容,更多請關注php中文網(wǎng)其它相關文章!
網(wǎng)站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產(chǎn)和維護的網(wǎng)站。