我有这项工作,但是我不确定这是否是最好的解决方法。我觉得每种方法都应该有一种更简单的方法-addTodo,deleteTodoById,updateTodo。我正在使用BehaviourSubject修改数组,但是在我更新时,我希望消除用户输入(或延迟)并在后台更新本地存储如何改善和简化RXJS代码?import { Injectable } from "@angular/core"import { Todo } from "./todo"import { BehaviorSubject, Observable } from 'rxjs'import { take } from 'rxjs/operators'@Injectable()export class TodoService { todos: BehaviorSubject<Todo[]> = new BehaviorSubject<Todo[]>([]); observable: Observable<Todo[]> = this.todos.asObservable(); getTodos(): Observable<Todo[]> { try { const todos: Todo[] = JSON.parse(localStorage.getItem('todos')) if(!todos) { return this.todos } this.todos.pipe(take(1)).subscribe(() => { return this.todos.next(todos) }) return this.todos; } catch(err) { console.log('have no local storage') } } addTodo(todo: Todo): TodoService { this.todos.pipe(take(1)).subscribe(todos => { this.updateLocalStorage([...todos, todo]) return this.todos.next([...todos, todo]) }) return this } deleteTodoById(id): TodoService { this.todos.pipe(take(1)).subscribe(todos => { const filteredTodos = todos.filter(t => t.id !== id) this.updateLocalStorage(filteredTodos) return this.todos.next(filteredTodos) }) return this } updateTodo(id, title): void { this.todos.pipe(take(1)).subscribe((todos) => { const todo = todos.find(t => t.id === id) if(todo) { todo.title = title const newTodos = todos.map(t => (t.id === id ? todo : t)) this.updateLocalStorage(newTodos) return this.todos.next(newTodos) } }) } updateLocalStorage(todos):void { this.todos.subscribe(t => { setTimeout(() => { localStorage.setItem('todos', JSON.stringify(todos)) }, 300) }) }}
添加回答
举报
0/150
提交
取消