通过.value 访问BehaviorSubject 是一个不好的做法吗?

问题描述 投票:0回答:1

我听说通过

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));
    }
}
angular rxjs
1个回答
0
投票

在您的实现中,其中一种方法是非响应式的 - 它是 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[]>([]);
© www.soinside.com 2019 - 2024. All rights reserved.