我听说通过
BehaviorSubject
公开您的 .asObservable()
并创建一个 API 来添加/删除其中的元素被认为是很好的做法。
下面的实现是推荐的方法吗?
我以前从未在BehaviorSubject 上使用过
.value
。我一直认为这是不好的做法(而不是订阅)。
任何有关如何改进此实施的建议将不胜感激。
export class TodoService {
private _todos: BehaviorSubject<Todo[]> = new BehaviorSubject([] as Todo[]);
constructor() {
}
get todos() {
return this._todos.asObservable();
}
public addTodo(todo: Todo) {
this._todos.next([...this._todos.value, todo]);
}
public removeTodo(index: number) {
const tempArray = [...this._todos.value];
tempArray.splice(index, 1);
this._todos.next(tempArray);
}
public updateTodo(index: number, todo: Todo) {
const todos = this._todos.value;
todos[index] = todo;
this._todos.next([...todos]);
}
public getTodo(index: number): Todo {
return this._todos.value[index];
}
public clearCompleted() {
this._todos.next(this._todos.value.filter(todo => !todo.completed));
}
}
在您的实现中,其中一种方法是非响应式的 - 它是 getTodo。它将使您的服务更加一致,成为完全响应式的,因此建议的改进是像这样重写 getTodo :
public getTodoByIndex(index: number): Observable<Todo> {
return this._todos.pipe(
map((todos) => todos[index])
);
}
通过
.value
、addTodo
、removeTodo
、updateTodo
方法使用 clearCompleted
是可以的,因为它封装在方法中。
P.S 对BehaviorSubject 启动的一点改进:
private _todos = new BehaviorSubject<Todo[]>([]);