如何在Foundry Function中编辑关联的只读对象集合?
多对多关联中只读数组的编辑解决方案
针对你遇到的readonly ObjectTypeB[]无法直接操作的问题,分场景给出解决方法:
1. 编辑关联对象的属性
all()返回的只读数组仅限制数组本身的结构操作(如push、splice),但数组内的ObjectTypeB实例属性如果是可写的,可直接遍历修改:
@OntologyEditFunction() public async editLinkedObjects(objA: ObjectTypeA): Promise<void> { const linkedObjects = objA.objectTypeB.all(); // 遍历修改每个关联对象的属性 linkedObjects.forEach(objB => { objB.propertyName = "updatedValue"; // 执行其他属性编辑操作 }); }
2. 修改多对多关联关系(增/删对象)
如果需要调整关联的对象集合(添加或移除ObjectTypeB),不能直接操作只读数组,需使用本体框架提供的关联操作API(通常是add()和remove()方法):
@OntologyEditFunction() public async editLinkedObjects(objA: ObjectTypeA): Promise<void> { // 示例:添加新的ObjectTypeB关联 const newObjB = await this.ontologyService.create(ObjectTypeB, { /* 初始化属性 */ }); objA.objectTypeB.add(newObjB); // 示例:移除指定的关联对象 const targetObjB = objA.objectTypeB.all().find(b => b.id === "target-object-id"); if (targetObjB) { objA.objectTypeB.remove(targetObjB); } }
3. 将只读数组转为可修改数组副本
如果需要对数组本身做排序、过滤等操作,可通过扩展运算符或Array.from()创建普通数组副本:
@OntologyEditFunction() public async editLinkedObjects(objA: ObjectTypeA): Promise<void> { // 转为可修改数组 const mutableObjects = [...objA.objectTypeB.all()]; // 或使用Array.from // const mutableObjects = Array.from(objA.objectTypeB.all()); // 执行数组操作,比如排序 mutableObjects.sort((a, b) => a.name.localeCompare(b.name)); // 批量编辑对象属性 mutableObjects.forEach(obj => obj.status = "processed"); }
注意:该副本仅用于数组层面的操作,修改副本结构不会同步到原多对多关联关系,调整关联仍需用框架的关联API。
内容的提问来源于stack exchange,提问作者Max Magid
相关产品推荐
相关产品推荐

