관찰 가능한 개체의 속성을 업데이트해야합니다. 나는 그럭저럭 일하게 할 수 있었다. 그러나 나는 내가 그것을했던 방법을 정말로 좋아하지 않는다. 이 경우 filter$
값 개체를 업데이트 할 수있는 더 우아한 방법은Observable/BehaviorSubject를 코드에서 업데이트하는 방법은 무엇입니까?
next(filter$: BehaviorSubject<GridCollectionFilter>, collection: GridCollectionModel<any>) {
let filter = filter$.value;
if (!filter.page) {
filter.page = 1;
}
filter.page++;
if (filter.page > collection.pageCount) {
filter.page = collection.pageCount;
}
this.updateFilter(filter$);
}
first(filter$: BehaviorSubject<GridCollectionFilter>) {
filter$.value.page = 1;
this.updateFilter(filter$);
}
last(filter$: BehaviorSubject<GridCollectionFilter>, collection: GridCollectionModel<any>) {
filter$.value.page = collection.pageCount;
this.updateFilter(filter$);
}
updateFilter(filter$: BehaviorSubject<GridCollectionFilter>, filter?: GridCollectionFilter) {
filter$.next(_.clone(filter || filter$.value));
}
있습니까?
filter$.next(_.clone(filter$.value))
내가 코드를 통해 관찰 된 개체의 몇 가지 속성을 단순히 업데이트하려고 할 때마다 관찰 대상의 복제본을 개로 먹이는 아이디어를 정말 싫어합니다. 참조를 깨기 위해 _.clone()
을 사용하고 있습니다. 그렇지 않으면 명백한 이유 때문에 rxjs distinctUntilChanged()
이 트리거되지 않습니다.
내가하고있는 일을 줄여 줄 수있는 rxjs 확장이 있습니까? 나는 내부적으로 filter$.next(_.clone(filter$.value))
을 할 filter$.commitValueChanges()
줄을 따라 생각하고 있습니다.
저는 처음부터 완전히 잘못된 방식으로 이것을 생각하고 있는지 잘 모르겠다. 변경 청취자를 트리거하려고 할 때 새로운 상태를 적용해야한다는 것을 이해합니다. 확실하지 않은 점은 필터 $ .value를 직접 수정해야하는지 여부입니다. 또는 일반적으로 filter
(필터)과 filter$
(필터를 관찰 할 수 있음)이라는 두 개체가 있고 그 다음에 filter
이 변경 될 때마다 filter
을 .next()
으로 제출하면됩니다. 그러나 이제는 두 개의 객체가 있는데, 이는 응용 프로그램을 통해 변경 중이며 다양한 이벤트 핸들러를 연결하여 수동으로 처리해야하는 객체와 다른 객체를 업데이트 할 수있는 객체 인 - filter$
을 가지고 있기 때문에 중복되는 것처럼 보일 것입니다. 그것은 나에게 과도하고 해커처럼 보입니다.
Thnx.
나는 'distinctUntilKeyChanged()'비트를 좋아하는데, 그것은 매우 도움이된다. 나는 그것을 인식하지 못했다. 하지만 추가적인 복잡성을 추가하고 코드를 중복하여 추가 currentFilter 필드를 추가하는 것은 큰 팬이 아닙니다. 나는 두 개의 필터 객체를 가지지 않으려 고하고 있는데, 단 하나의 트릭을 수행 할 수 있어야한다는 의견이 있습니다. 그들 중 두 명은 해커와 지저분한 느낌을 갖습니다. – pootzko
붙여 넣은 메서드는 실제로 서비스 클래스에 있지만 구성 요소에는 없습니다. 'filter $'observable은 커스텀'BaseGridComponent'에 의해 만들어진 무언가이며 이벤트 핸들러 메쏘드 (다음에 붙여 넣지 않은 첫 번째와 다른 것들)는'filter $'를 업데이트해야합니다. 말이된다. 'filter $ .value'는 관찰 된 것이고, 그것이 바뀔 때, 필터 객체는 백엔드로 전송되어 데이터를 가져옵니다. – pootzko
그래서 그것을 BaseGridComponent 컴포넌트로 이동하십시오. BaseGridComponent로 확장 한 그리드에서 필터 변경을 수신 한 다음 rest API를 호출하여 콜렉션을 다시로드합니다. 어떻게 생각하니? – pioro90