【发布时间】:2019-04-08 05:11:52
【问题描述】:
我有这个工作,但我不确定这是否是最好的方法。我觉得每个方法中应该有一个更简单的方法——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)
})
}
}
【问题讨论】:
标签: javascript angular rxjs