1e41f4b71Sopenharmony_ci# NodeController 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ciNodeController用于实现自定义节点的创建、显示、更新等操作的管理,并负责将自定义节点挂载到[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)上。 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci> **说明:** 6e41f4b71Sopenharmony_ci> 7e41f4b71Sopenharmony_ci> 本模块首批接口从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 8e41f4b71Sopenharmony_ci> 9e41f4b71Sopenharmony_ci> 当前不支持在预览器中使用NodeController。 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci## 导入模块 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ci```ts 14e41f4b71Sopenharmony_ciimport { NodeController } from '@kit.ArkUI'; 15e41f4b71Sopenharmony_ci``` 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci## NodeController 18e41f4b71Sopenharmony_ci 19e41f4b71Sopenharmony_ci通常搭配[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)进行使用。用于创建控制器管理绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)组件。一个NodeController只允许与一个[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)进行绑定。 20e41f4b71Sopenharmony_ci 21e41f4b71Sopenharmony_ci**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 22e41f4b71Sopenharmony_ci 23e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 24e41f4b71Sopenharmony_ci 25e41f4b71Sopenharmony_ci### makeNode 26e41f4b71Sopenharmony_ci 27e41f4b71Sopenharmony_ciabstract makeNode(uiContext : UIContext): FrameNode | null 28e41f4b71Sopenharmony_ci 29e41f4b71Sopenharmony_ci当实例绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)创建的时候进行回调。回调方法将返回一个节点,将该节点挂载至[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)。 30e41f4b71Sopenharmony_ci或者可以通过NodeController的rebuild()方法进行回调的触发。 31e41f4b71Sopenharmony_ci 32e41f4b71Sopenharmony_ci**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 33e41f4b71Sopenharmony_ci 34e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 35e41f4b71Sopenharmony_ci 36e41f4b71Sopenharmony_ci**参数:** 37e41f4b71Sopenharmony_ci 38e41f4b71Sopenharmony_ci| 参数名 | 类型 | 必填 | 说明 | 39e41f4b71Sopenharmony_ci| --------- | ----------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------- | 40e41f4b71Sopenharmony_ci| uiContext | [UIContext](./js-apis-arkui-UIContext.md) | 是 | 回调该方法的时候,绑定[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)的UI上下文。 | 41e41f4b71Sopenharmony_ci 42e41f4b71Sopenharmony_ci**返回值:** 43e41f4b71Sopenharmony_ci 44e41f4b71Sopenharmony_ci| 类型 | 说明 | 45e41f4b71Sopenharmony_ci| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 46e41f4b71Sopenharmony_ci| [FrameNode](./js-apis-arkui-frameNode.md#framenode)\| null | 一个FrameNode对象,返回的节点将被挂载至[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)的占位节点上。若返回null对象,将清空对应[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)的子节点。 | 47e41f4b71Sopenharmony_ci 48e41f4b71Sopenharmony_ci### aboutToAppear 49e41f4b71Sopenharmony_ci 50e41f4b71Sopenharmony_ciaboutToAppear?(): void 51e41f4b71Sopenharmony_ci 52e41f4b71Sopenharmony_ci当NodeController绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)挂载显示后触发此回调。 53e41f4b71Sopenharmony_ci 54e41f4b71Sopenharmony_ci> **说明:** 55e41f4b71Sopenharmony_ci> 56e41f4b71Sopenharmony_ci> 回调时机参考[onAppear](arkui-ts/ts-universal-events-show-hide.md#onappear)。 57e41f4b71Sopenharmony_ci 58e41f4b71Sopenharmony_ci**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 59e41f4b71Sopenharmony_ci 60e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 61e41f4b71Sopenharmony_ci 62e41f4b71Sopenharmony_ci### aboutToDisappear 63e41f4b71Sopenharmony_ci 64e41f4b71Sopenharmony_ciaboutToDisappear?(): void 65e41f4b71Sopenharmony_ci 66e41f4b71Sopenharmony_ci当NodeController绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)卸载消失时触发此回调。 67e41f4b71Sopenharmony_ci 68e41f4b71Sopenharmony_ci> **说明:** 69e41f4b71Sopenharmony_ci> 70e41f4b71Sopenharmony_ci> 回调时机参考[onDisAppear](arkui-ts/ts-universal-events-show-hide.md#ondisappear)。 71e41f4b71Sopenharmony_ci 72e41f4b71Sopenharmony_ci**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 73e41f4b71Sopenharmony_ci 74e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 75e41f4b71Sopenharmony_ci 76e41f4b71Sopenharmony_ci### aboutToResize 77e41f4b71Sopenharmony_ci 78e41f4b71Sopenharmony_ciaboutToResize?(size: Size): void 79e41f4b71Sopenharmony_ci 80e41f4b71Sopenharmony_ci当NodeController绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)布局的时候触发此回调。 81e41f4b71Sopenharmony_ci 82e41f4b71Sopenharmony_ci**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 83e41f4b71Sopenharmony_ci 84e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 85e41f4b71Sopenharmony_ci 86e41f4b71Sopenharmony_ci**参数:** 87e41f4b71Sopenharmony_ci 88e41f4b71Sopenharmony_ci| 参数名 | 类型 | 必填 | 说明 | 89e41f4b71Sopenharmony_ci| ------ | ---------------------------------------- | ---- | ---------------------------------------- | 90e41f4b71Sopenharmony_ci| size | [Size](./js-apis-arkui-graphics.md#size) | 是 | 用于返回组件布局大小的宽和高,单位为vp。 | 91e41f4b71Sopenharmony_ci 92e41f4b71Sopenharmony_ci### onTouchEvent 93e41f4b71Sopenharmony_ci 94e41f4b71Sopenharmony_cionTouchEvent?(event: TouchEvent): void 95e41f4b71Sopenharmony_ci 96e41f4b71Sopenharmony_ci当NodeController绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)收到Touch事件时触发此回调。 97e41f4b71Sopenharmony_ci 98e41f4b71Sopenharmony_ci**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 99e41f4b71Sopenharmony_ci 100e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 101e41f4b71Sopenharmony_ci 102e41f4b71Sopenharmony_ci**参数:** 103e41f4b71Sopenharmony_ci 104e41f4b71Sopenharmony_ci| 参数名 | 类型 | 必填 | 说明 | 105e41f4b71Sopenharmony_ci| ------ | ------------------------------------------------------------------------- | ---- | ---------- | 106e41f4b71Sopenharmony_ci| event | [TouchEvent](arkui-ts/ts-universal-events-touch.md#touchevent对象说明) | 是 | 触摸事件。 | 107e41f4b71Sopenharmony_ci 108e41f4b71Sopenharmony_ci### rebuild 109e41f4b71Sopenharmony_ci 110e41f4b71Sopenharmony_cirebuild(): void 111e41f4b71Sopenharmony_ci 112e41f4b71Sopenharmony_ci调用此接口通知[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)组件重新回调[makeNode](#makenode)方法,更改子节点。 113e41f4b71Sopenharmony_ci 114e41f4b71Sopenharmony_ci**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 115e41f4b71Sopenharmony_ci 116e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 117e41f4b71Sopenharmony_ci 118e41f4b71Sopenharmony_ci> **说明:** 119e41f4b71Sopenharmony_ci> 由于rebuild方法为应用主动调用的方法,且该操作与UI相关。需要开发者自行保证调用该接口时UI上下文有效,即与绑定的NodeContainer保持UI上下文一致。 120e41f4b71Sopenharmony_ci> 121e41f4b71Sopenharmony_ci> 监听回调等UI上下文不明确时,可以通过[UIContext](./js-apis-arkui-UIContext.md)的[runScopedTask](./js-apis-arkui-UIContext.md#runscopedtask)方法明确调用时的UI上下文。 122e41f4b71Sopenharmony_ci 123e41f4b71Sopenharmony_ci### 示例 124e41f4b71Sopenharmony_ci 125e41f4b71Sopenharmony_ci```ts 126e41f4b71Sopenharmony_ciimport { NodeController, BuilderNode, Size, FrameNode ,UIContext } from '@kit.ArkUI'; 127e41f4b71Sopenharmony_ci 128e41f4b71Sopenharmony_ciclass Params { 129e41f4b71Sopenharmony_ci text: string = "this is a text" 130e41f4b71Sopenharmony_ci} 131e41f4b71Sopenharmony_ci 132e41f4b71Sopenharmony_ci@Builder 133e41f4b71Sopenharmony_cifunction buttonBuilder(params: Params) { 134e41f4b71Sopenharmony_ci Column() { 135e41f4b71Sopenharmony_ci Button(params.text) 136e41f4b71Sopenharmony_ci .fontSize(12) 137e41f4b71Sopenharmony_ci .borderRadius(8) 138e41f4b71Sopenharmony_ci .borderWidth(2) 139e41f4b71Sopenharmony_ci .backgroundColor(Color.Orange) 140e41f4b71Sopenharmony_ci } 141e41f4b71Sopenharmony_ci} 142e41f4b71Sopenharmony_ci 143e41f4b71Sopenharmony_ciclass MyNodeController extends NodeController { 144e41f4b71Sopenharmony_ci private buttonNode: BuilderNode<[Params]> | null = null; 145e41f4b71Sopenharmony_ci private wrapBuilder: WrappedBuilder<[Params]> = wrapBuilder(buttonBuilder); 146e41f4b71Sopenharmony_ci 147e41f4b71Sopenharmony_ci makeNode(uiContext: UIContext): FrameNode { 148e41f4b71Sopenharmony_ci if (this.buttonNode == null) { 149e41f4b71Sopenharmony_ci this.buttonNode = new BuilderNode(uiContext); 150e41f4b71Sopenharmony_ci this.buttonNode.build(this.wrapBuilder, { text: "This is a Button" }) 151e41f4b71Sopenharmony_ci } 152e41f4b71Sopenharmony_ci return this.buttonNode!.getFrameNode()!; 153e41f4b71Sopenharmony_ci } 154e41f4b71Sopenharmony_ci 155e41f4b71Sopenharmony_ci aboutToResize(size: Size) { 156e41f4b71Sopenharmony_ci console.log("aboutToResize width : " + size.width + " height : " + size.height) 157e41f4b71Sopenharmony_ci } 158e41f4b71Sopenharmony_ci 159e41f4b71Sopenharmony_ci aboutToAppear() { 160e41f4b71Sopenharmony_ci console.log("aboutToAppear") 161e41f4b71Sopenharmony_ci } 162e41f4b71Sopenharmony_ci 163e41f4b71Sopenharmony_ci aboutToDisappear() { 164e41f4b71Sopenharmony_ci console.log("aboutToDisappear"); 165e41f4b71Sopenharmony_ci } 166e41f4b71Sopenharmony_ci 167e41f4b71Sopenharmony_ci onTouchEvent(event:TouchEvent) { 168e41f4b71Sopenharmony_ci console.log("onTouchEvent"); 169e41f4b71Sopenharmony_ci } 170e41f4b71Sopenharmony_ci} 171e41f4b71Sopenharmony_ci 172e41f4b71Sopenharmony_ci@Entry 173e41f4b71Sopenharmony_ci@Component 174e41f4b71Sopenharmony_cistruct Index { 175e41f4b71Sopenharmony_ci private myNodeController: MyNodeController = new MyNodeController(); 176e41f4b71Sopenharmony_ci 177e41f4b71Sopenharmony_ci build() { 178e41f4b71Sopenharmony_ci Column() { 179e41f4b71Sopenharmony_ci NodeContainer(this.myNodeController) 180e41f4b71Sopenharmony_ci } 181e41f4b71Sopenharmony_ci .padding({ left: 35, right: 35, top: 35 }) 182e41f4b71Sopenharmony_ci .width("100%") 183e41f4b71Sopenharmony_ci .height("100%") 184e41f4b71Sopenharmony_ci } 185e41f4b71Sopenharmony_ci} 186e41f4b71Sopenharmony_ci``` 187e41f4b71Sopenharmony_ci