跳转到内容

批量更新元素 ​

当宿主应用的一次操作需要修改多个页面中的元素时,可以使用 updateElements。 例如,“调整报告标题”按钮可以同时移动两页的标题,无需离开用户正在编辑的页面。

React、Vue、Angular、Svelte 和原生 JavaScript 的公开组件句柄均提供此方法。 ElementUpdate 和 ElementUpdateOptions 类型由各框架的组件包直接导出。

ts
updateElements(
	updates: readonly ElementUpdate[],
	options?: ElementUpdateOptions,
): Promise<void>;

interface ElementUpdate {
	slideId: string;
	elementId: string;
	patch: Partial<PptxElement>;
}

interface ElementUpdateOptions {
	label?: string;
}

下面的 viewer 表示当前公开组件句柄,示例中的两页各有一个标题元素:

ts
const [first, second] = viewer.getSlides();

await viewer.updateElements(
	[
		{
			slideId: first.id,
			elementId: first.elements[0].id,
			patch: { x: 84 },
		},
		{
			slideId: second.id,
			elementId: second.elements[0].id,
			patch: { x: 90 },
		},
	],
	{ label: '调整报告标题' },
);

viewer.undo(); // 一次撤销,同时恢复两个标题。
viewer.redo(); // 一次重做,同时重新应用两项修改。

提交与撤销行为 ​

  • 每个产生实际变化的批次占用一个撤销步骤,与前后的编辑相互独立。 即使在同一个 JavaScript 执行轮次中提交两批修改,它们也能分别撤销。
  • 应用批次保留当前页面和元素选择,不会跳转到目标页。 撤销和重做沿用组件原有的快照恢复行为。
  • 读取结果或执行依赖此结果的操作前,应等待返回的 Promise 完成。 React 中应重新读取 ref.current,再调用句柄上的读取方法。
  • 有效批次会先单独提交尚未结束的行内文字编辑。 请在拖动、缩放元素等指针交互结束后提交批次;五种框架实现都会拒绝在指针交互过程中提交批次。 被拒绝的批次不会提交正在编辑的文本,也不会修改文档状态或撤销历史。
  • 空批次和没有最终净变化的批次不会改变历史记录或 dirty 状态。 被拒绝的批次保留文档以及撤销、重做栈。
  • 现有 updateElement 方法继续使用当前页的逐次编辑语义。

目标、补丁与错误 ​

批量更新要求文档已加载、允许编辑,且处于普通幻灯片的编辑模式。 只读、预览、演示、母版和模板编辑状态下,返回的 Promise 会被拒绝。 slideId 必须唯一定位一页,elementId 必须唯一定位该页中的一个顶层元素。 组合内部的子元素和母版、版式元素不在此接口的处理范围内。

接口会在提交任何更新前检查全部目标和补丁。任何目标缺失或不唯一,都会导致整批失败。 补丁必须是对象,不能替换元素的 id 或 type;位置、尺寸和旋转值必须是有限数字, 宽高不能为负数。其他字段沿用 Partial<PptxElement> 的约束,此接口不提供完整的元素结构校验。

与 updateElement 一样,补丁按属性进行浅层替换;修改嵌套属性时,应提供该属性的完整值。 同一元素出现多次时按输入顺序应用。接口会复制输入数据,因此调用后再修改补丁对象不会影响已提交的批次。

基于 Apache-2.0 许可证发布