Population

Comments of a post of a user

@frrri/ngxs-crud/populate exposes a populate() instruction.

Imagine the following scenario:

interface Post {
    id: number;
    userId: number;
    title: string;
    body: string;
}

interface Comment {
    id: number;
    postId: number;
    userId: number;
    body: number;
}

interface User {
    id: number;
    name: string;
}

Now if you want to display the user's name for every post in your list, you can use populate() to instruct the frrri resolver to fetch every post's user.

You can also fetch all comments for a post and then every user for every comment.

The populate() route instruction

Getting every post's user

import { populate } from '@frrri/ngxs-crud/populate';

const routes: Routes = [
    {
        path: 'posts-with-user',
        component: PostsIndexComponent,
        data: instructions({
            'entities': reset(), // Resets all entities upon entering the route
            'entities.posts': [
                deactivate(), // Deactivates entity, if any was active
                getMany(),
                populate({
                    statePath: 'entities.users', // The target state's path
                    idPath: 'userId', // Where to find the User's id on Post
                }),
            ],
        }),
    }
]

When opening /posts-with-user, it will load all posts and then all users of the loaded posts. If you are using PaginatedCrudCollection, it will do so for every page you load.

Getting one post's comments (via PopulationStrategy.ForeignId)

const routes: Routes = [
    {
        path: ':id',
        component: PostsShowComponent,
        data: instructions({
            'entities.comments': reset(), // Reset comments
            'entities.posts': [
                getActive(), // Activates a comment via the routes :id param
                populate({
                    statePath: 'entities.comments',
                    idPath: 'postId', // Where to find the Post's id on Comment
                    strategy: PopulationStrategy.ForeignId, // Look for id on Comment instead of Post
                }),
            ],
        }),
    }
]

The same configuration would also work if you would change getActive() to getMany(). This would, however, populate all comments of every post loaded by getMany().

Last updated