Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度/离子-Ngrx-更新阵列中的对象_Angular_Ionic Framework_Ngrx_Ngrx Store_Ngrx Entity - Fatal编程技术网

Angular 角度/离子-Ngrx-更新阵列中的对象

Angular 角度/离子-Ngrx-更新阵列中的对象,angular,ionic-framework,ngrx,ngrx-store,ngrx-entity,Angular,Ionic Framework,Ngrx,Ngrx Store,Ngrx Entity,我正在使用离子+角度+Ngrx和Firebase/Angularfire。我对所有这些都是相当陌生的(除了Firebase),并且有React开发的背景。我创建了一个非常简单的笔记应用程序,它将数据存储在Firebase中,并从FB获取旧笔记。我让所有的工作,但决定把Ngrx的国家管理。我在获取和创建方面没有问题,但是更新部分有点棘手 我从Firebase获得了一个对象数组,我希望能够只更新单个对象数据。下面是一张Ngrx状态图,需要澄清 我希望能够更新对象nr2中的描述文本。我如何管理它?

我正在使用离子+角度+Ngrx和Firebase/Angularfire。我对所有这些都是相当陌生的(除了Firebase),并且有React开发的背景。我创建了一个非常简单的笔记应用程序,它将数据存储在Firebase中,并从FB获取旧笔记。我让所有的工作,但决定把Ngrx的国家管理。我在获取和创建方面没有问题,但是更新部分有点棘手

我从Firebase获得了一个对象数组,我希望能够只更新单个对象数据。下面是一张Ngrx状态图,需要澄清

我希望能够更新对象nr2中的描述文本。我如何管理它?

在数组中创建新对象不是问题。此代码适用于以下情况:

on(NoteActions.createSingleField, (state, action) => {
const id = action.data.id;
const current = state.entities[action.data.id]?.[action.data.type];
return adapter.updateOne(
  {
    id,
    changes: {
      [action.data.type]: [
        ...current,
        { description: action.data.description },
      ],
    },
  },
  state
);
}),

我尝试了上述代码的不同变体,但仍然无法使其正常工作。我也试过:

    const test = state.entities[id]?.[type].map((obj, i) => {
  console.log('obj; ', i);
  return i === 0
    ? (obj.description = action.data.description)
    : obj.description;
});
但这只会给出以下错误信息:

错误类型错误:无法分配到的只读属性“说明” 对象“[对象]”

谢谢你的帮助

更新-解决方案 经过一番挣扎,我终于找到了解决办法。如果有人想弄明白,我会和你分享

const current = state.entities[action.data.id]?. 
[action.data.type].slice();
current.splice(currentIndex, 1, { description: action.data.description });
首先,我使用.slice()创建了当前实体状态的副本。[]中的代码仅表示字段名是动态的。然后,我使用当前索引执行了.splice()操作,并将旧数据替换为新数据。然后我使用updateOne()更新了存储/实体。想起来很简单,我不知道为什么花了这么长时间才弄明白。希望解决方案能对您有所帮助

 return adapter.updateOne(
  {
    id,
    changes: {
      [action.data.type]: [...current],
    },
  },
  state
);