Estou tentando realizar uma operação CRUD completa usando Angular + Cloud Firestore + NGRX / Entity.
Id é o parâmetro necessário para executar ngrx / entidade. Mas quando crio um item da minha forma angular para a minha loja de fogo, ainda não sei o id, pois seria atribuído automaticamente com o id do documento da minha futura criação.
Como posso enviar dados para o firestore usando ngrx / entity sem enviar o id?
Eu tenho uma interface como a seguir:
Interface da entidade:
export interface Recipe {
id: string;
recipeTitle: string;
}
actions.ts:
export const addRecipe = createAction(
'[Recipe Add Component] Add Recipe',
props<{ recipe: Recipe }>()
);
export const addRecipeSuccess = createAction(
'[Recipe Add Effect] Add Recipe Success',
props<{ recipe: Recipe }>()
);
export const addRecipeFailure = createAction(
'[Recipe Add Effect] Add Recipe Failure',
props<{ error: any }>()
);
Reducer.ts
// entity adapter
export const recipeAdapter: EntityAdapter<Recipe> = createEntityAdapter<Recipe>({
});
export interface RecipeState extends EntityState<Recipe> {
error: any;
selectedRecipe: Recipe;
}
export const initialState: RecipeState = recipeAdapter.getInitialState({
error: undefined,
selectedRecipe: undefined
});
export const recipeReducer = createReducer(
initialState,
on(RecipeActions.addRecipeSuccess, (state, action) => {
return recipeAdapter.addOne(action.recipe, state);
}),
on(RecipeActions.addRecipeFailure, (state, action) => {
return {
...state,
error: action.error
};
}),
Effects.ts
createRecipe$ = createEffect(() =>
this.actions$.pipe(
ofType(fromRecipeActions.addRecipe),
mergeMap(action =>
this.recipeService.createRecipe(action.recipe).pipe(
map(recipe => fromRecipeActions.addRecipeSuccess({recipe})),
catchError(error =>
of(fromRecipeActions.addRecipeFailure({ error }))
)
)
)
)
);
Criar Component.ts
createRecipe(formGroup): void {
const recipeCreated = {
recipeTitle: formGroup.recipeTitle
};
this.store.dispatch(actions.addRecipe({recipe: recipeCreated}));
this.router.navigate(['tabs/recipe']);
}
service.ts
createRecipe(recipe): Observable<any> {
return from(this.firestore.collection(`recipes`).add(recipe));
}
getRecipes(): Observable<any[]> {
return this.firestore.collection<Recipe>('recipes').snapshotChanges().pipe(map(arr => {
return arr.map(doc => {
const data = doc.payload.doc.data();
return {
id: doc.payload.doc.id,
...data
} as Recipe;
});
}));
}
deleteRecipe(recipeId: string) {
return from(this.firestore.collection<Recipe>('recipes/').doc(recipeId).delete());
}
Você pode criar um seletor de ID personalizado que tornaria o id opcional:
export const recipeAdapter: EntityAdapter<Recipe> = createEntityAdapter<Recipe>({
selectId: t => t.id || 0
});
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras