CombineLatest is triggered although sources did not change -- [Question Asked]

Query asked by user

I am using Angular as the frontend

grid$: Observable < any[][] > | null = null
ngOnInit() {
    this.grid$ = combineLatest([this.route.queryParams, source1, source2])
        .pipe(
            map(data => {
                 window.scroll(0,0) // go to top when route params change
                //do something with the sources and route params
                return grid;
            })
        )
}

I am using grid$ with async pipe

<ng-container *ngIf="grid$ | async as grid>
<div *ngFor="let column of columns>
    <div *ngFor="let analyse of grid[column]"> ... </div>
</div>
</ng-container>

which is working fine.

Now I want to change the grid after specific events occured


changeGrid() {
    // I also tried to just use map without assignment and return a new grid but then nothing happens
    this.grid$ = this.grid$.pipe(
        map(grid => {
            // do something with grid
            return grid;
        })
    }
}

which is also working. The only side effect I have is that combineLatest is triggered as well although sources did not change so that you scroll automatically to the top again which is not intended. Could someone explain me why? I tried it with distinctUntilChanged in combineLatest but it is not triggered anymore when using changeGrid(). I used distinctUntilChanged in the following way

distinctUntilChanged((prev,curr) => 
{ 
    return prev[0].get("id") != curr[0].get("id")
}) 

Answer we found from sources

First, by writing this.grid$ = ... you lose the memory reference to its previous value. This means you can’t stop the previous observable, which is in the combineLatest. This might be the cause of your issue.

Second, Since you use the queryParams observable, it means that on every query param change, your observable gets triggered. You didn’t give enough code to show if it’s the case, but this also might be the other cause of your issue.

Finally, distinctUntilChanged compares memory references : when being used with combineLatest, unless you provide a function to it, the operaor is useless (a new array is being created each time the combineLatest emits).

Answered By – temp_user

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0


What is Angular?

Angular is an open-source, JavaScript outline written in TypeScript. Google keeps up with it, and its basic role is to foster single-page activities. As an edge, Angular enjoys clear benefits while likewise outfitting a standard design for formulators to work with. It empowers stoners to deliver huge tasks in a viable way. textures overall lift web improvement viability and execution by outfitting an agreeable construction so that formulators do n't need to continue to modify regulation from scratch. textures are efficient devices that offer formulators a large group of extra elements that can be added to programming easily.

However, is JavaScript ideal for creating single-sprinter activities that bear particularity, testability, and trend-setter efficiency? maybe not.

JavaScript is the most by and large utilized client-side prearranging language. It's composed into HTML reports to empower relations with web sprinters in endless extraordinary ways. As a genuinely simple to-learn language with inescapable help, creating current operations is appropriate.

Nowadays, we have various textures and libraries intended to give essential outcomes. As for front end web advancement, Angular addresses incalculable, while possibly not all, of the issues formulators face while utilizing JavaScript all alone.
Who we are?

We are team of software engineers in multiple domains like Programming and coding, Fundamentals of computer science, Design and architecture, Algorithms and data structures, Information analysis, Debugging software and Testing software. We are working on Systems developer and application developer. We are curious, methodical, rational, analytical, and logical. Some of us are also conventional, meaning we're conscientious and conservative.

Answer collected from stackoverflow and other sources, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0