Estoy tratando de crear una aplicación de noticias que pueda recibir la respuesta de la API de noticias y almacenarla en newsFeed y luego el usuario puede marcar algunas noticias como favoritas y luego almacenar estas favoritas en el nuevo modelo favorito.
este es el error que estoy recibiendo
Error: [mobx-state-tree] No se puede agregar un objeto a un árbol de estado si ya forma parte del mismo u otro árbol de estado. Intenté asignar un objeto a '/newsStore/favorite/0', pero ya vive en '/newsStore/newsFeed/0', motor js: hermes aquí está mi modelo de noticias
export const NewsModel = types .model('News') .props({ newsFeed: types.array(News), favorite: types.array(News), totalResults: types.maybeNull(types.number), newsUserTask: types.optional(AsyncTask, {}), })así es como llamo a la API y la almaceno en NewsFeed
.actions(self => { const newsCall = (page: number, feed: boolean) => runTask(self.newsUserTask, function* ({ exec }) { const result = yield* toGenerator( self.environment.baseApi.newsFeed(page), ); exec(() => { if ((result as NewsTypeResponse).status === 'ok') { if (self.newsFeed.length) { if (page < Math.ceil(self.totalResults / 10)) { self.newsFeed = castToSnapshot([ ...self.newsFeed, ...(result as NewsTypeResponse).articles, ]); } else { self.rootStore.errorStore.setError( translate('errors.endOfPage'), ); } self.newsFeed = castToSnapshot([ ...self.newsFeed, ...(result as NewsTypeResponse).articles, ]); } else { if (feed) { self.totalResults = castToSnapshot( (result as NewsTypeResponse).totalResults, ); self.newsFeed = castToSnapshot( (result as NewsTypeResponse).articles, ); } else { self.newsData = castToSnapshot( (result as NewsTypeResponse).articles, ); } console.log('load more working'); } console.log('working'); } else { console.log('not working'); } }); }); return { newsCall }; })y así es como estoy tratando de almacenar en favoritos
.actions(self => ({ setFav(item: NewsTypes) { self.favorite.push(item); }, }))¿Cómo puedo hacer esto? Intenté seguir algunas soluciones como esta. No se puede agregar un objeto a un árbol de estado si ya es parte del mismo u otro árbol de estado.
En su lugar, puede modelar su matriz favorite para que sea una matriz de referencias a News y simplemente agregar el identificador a esta matriz en la acción setFav (siempre que su modelo de News tenga types.identifier o types.identifierNumber ). Puede encontrar más información sobre estos conceptos aquí .
export const NewsModel = types .model('News') .props({ newsFeed: types.array(News), favorite: types.array(types.reference(News)), totalResults: types.maybeNull(types.number), newsUserTask: types.optional(AsyncTask, {}), }) .actions(self => ({ setFav(item: NewsTypes) { self.favorite.push(item.id); }, }));