이 글은 웹 애플리케이션에서 풍부한 대화형 실행 취소 및 전달 작업의 구현 방법(코드)을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
웹 애플리케이션에서 사용자는 일부 풍부한 대화형 작업을 수행할 때 필연적으로 잘못된 작업을 수행하게 됩니다. 예를 들어 서식 있는 텍스트 편집기에서 잘못된 글꼴 색상을 설정한 경우 이를 취소해야 하거나 H5를 만들 때 실수로 이미지를 삭제합니다. 온라인에서 프로토타입 애플리케이션을 디자인할 때 실수로 페이지를 삭제하는 등의 활동 페이지도 철회해야 합니다. 즉, 상호 작용 장면이 매우 복잡할 경우 이 때 '실행 취소'가 발생할 가능성이 매우 높습니다. '와 'forward' 두 가지 작업이 매우 필요하며 사용자 경험도 매우 좋습니다
Thinking
어떤 시나리오에서든 웹 애플리케이션이더라도 사용자의 모든 작업은 하나의 작업으로 간주될 수 있습니다. 특정 구성 요소 또는 객체의 상태 및 속성이 변경됩니다. 연속 작업 작업이 완료되고 다음 작업을 준비하기 전인 이 순간의 상태는 완전히 새로운 상태입니다
A —— B —— C
사용자가 수행할 때 동작하지 않으면 전역 상태는 A
User 컴포넌트를 동작시켜 위치로 이동합니다. 전역 상태를 B, 마지막 동작이 완료된 시점으로 되돌려야 할 때입니다.
그렇다면 각 작업의 동작을 기록하기 위해 이렇게 많은 양의 상태를 저장할 수 있는 리스트나 인덱스가 필요합니다
그런데 이렇게 많은 양의 데이터를 저장하기 위해 배열 변수를 사용한다면 조금 부적절할까요? 데이터 양이 많아지면 메모리가 터질 수도 있겠죠? 그래서 여기서는 모두에게 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 { /** * 发射DB集合存储的数据,可订阅 */ public launchDBDataValue$: Subject<idbdata> = new Subject<idbdata>() /** * 创建一个叫panelDataDB的本地数据库,版本号为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 0 } constructor() {} /** * 创建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() } /** * 往集合里添加数据 * 同时把新添加的key赋值给dbCurrentIndex, */ public dbAdd(): void { this.handleDbCurrentRefreshDB(); this.dbKey += 1; // 此处存储你要保存的数据 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集合失败') } ) } /** * 在执行添加数据集操作的时候判断dbCurrentIndex当前指引的下标是否低于dbKey * 如果是说明执行了后退操作之后后续动作执行了dbAdd的操作,则清空dbCurrentIndex索引之后的数据重新添加 */ public handleDbCurrentRefreshDB(): void { if (this.dbCurrentIndex {}) } this.dbKey = this.dbCurrentIndex } } /** * 执行后退操作发射DB数据集 */ public acquireBackDBData(): void { if( this.isBack ) { this.dbCurrentIndex -= 1 this.db.getByKey('panelItem', this.dbCurrentIndex).then(res=>{ this.launchDBDataValue$.next(res) },()=>{ }) } } /** * 执行前进操作发射DB数据集 */ 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 => {}) } }</object></boolean></boolean></boolean></idbdata></idbdata>
여기서 게으른데 자동 증가 ID를 키로 직접 사용하므로 검색에도 편리합니다
모든 작업 매장 데이터는 다음과 같습니다
마지막으로 제가 구현한 Undo 및 Forward 작업 장면을 보실 수 있습니다
위 내용은 웹 애플리케이션(코드)에서 풍부한 대화형 실행 취소 및 전달 작업 구현 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

随着互联网的不断发展,Web应用的需求也与日俱增。在过去,Web应用通常都是由多个页面组成的,但是现在越来越多的应用选择采用单页面应用(SPA)。单页面应用非常适合移动端的访问,而且用户无需等待页面的整个重新加载,增加了用户的体验。在本文中,将介绍如何使用Golang开发SPA应用。什么是单页面应用单页面应用是指只有一个HTML文件的Web应用。它使用Jav

随着互联网的发展和应用的普及,Web应用的需求也随之不断增长。而为了满足大量用户的需求,传统的Web应用往往会面临性能瓶颈和可扩展性问题。针对这些问题,微服务架构逐渐成为了Web应用开发的一种趋势和解决方案。而在微服务架构中,Beego框架成为了很多开发者的首选,其高效、灵活、易用的特点深受开发者的喜爱。本文将介绍使用Beego框架开发微服务架构的Web应用

随着互联网的普及和发展,Web应用程序已成为当今社会中不可或缺的重要组成部分。而对于大型的Web应用程序,一个高效、可扩展、可维护的框架是必不可少的。在这样的情况下,Django成为了一个备受欢迎的Web框架,因为它采用了许多最佳实践,从而能够帮助开发人员快速构建高质量的Web应用程序。在本文中,将会介绍一些使用Django构建大型Web应用程序的最佳实践。

随着互联网技术的不断发展,Web应用程序已经成为人们生活和工作中必不可少的一部分。而在Web应用开发中,选择合适的框架可以提高开发效率、加快开发速度、提高代码质量等方面发挥重要作用。本文将从什么是Go框架、Go框架的优点以及如何选择合适的Go框架这三个方面来分析Go框架的选择。一、什么是Go框架?Go是一种开源的编程语言,非常适合于构建高性能的Web应用程

随着Web应用的广泛应用,越来越多的开发者开始寻求一种高效快捷的方式来构建他们的应用。近年来,ThinkPHP6作为一款优秀的PHP框架,逐渐成为了整个领域中的佼佼者。在本文中,我们将会介绍如何使用ThinkPHP6打造出高效的Web应用,让你轻松应对业务中的各种挑战。1.ThinkPHP6简介ThinkPHP6是一款轻量级的高性能PHP框架,它为开发者提

利用PHP和SOAP构建基于Web的应用程序的完整指南在当今互联网的时代,基于Web的应用程序已经成为了管理和交互数据的重要工具。PHP作为一种强大的开发语言,可以与其他技术进行无缝集成,而SOAP(SimpleObjectAccessProtocol)作为一种基于XML的通信协议,为我们提供了一种简单、标准和可扩展的方法来构建Web服务。本文将为您提

随着互联网的不断发展,Web应用已成为企业信息化建设的重要组成部分,也是现代化工作的必要手段。为了使Web应用能够便于开发、维护和扩展,开发人员需要选择适合自己开发需求的技术框架和编程语言。PHP和AngularJS是两种非常流行的Web开发技术,它们分别是服务器端和客户端的解决方案,通过结合使用可以大大提高Web应用的开发效率和使用体验。PHP的优势PHP

Redis是一款基于内存的开源分布式键值存储系统,被广泛的应用于Web应用中,提供了许多有利的特性:高并发性、快速响应、可扩展性、持久性、数据类型多样性以及丰富的API等。本文将对Redis在Web应用中的应用场景进行分析。缓存缓存是Redis最为常见的应用场景之一,对于Web应用来说,如果需要频繁读取数据库中的数据,会造成数据库的瓶颈,导致性能不佳。这时候


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.
