• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# NodeController
2
3NodeController用于实现自定义节点的创建、显示、更新等操作的管理,并负责将自定义节点挂载到[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)上。
4
5> **说明:**
6>
7> 本模块首批接口从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8>
9> 当前不支持在预览器中使用NodeController。
10
11## 导入模块
12
13```ts
14import { NodeController } from "@ohos.arkui.node";
15```
16
17## NodeController
18
19通常搭配[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)进行绑定。
20
21**系统能力:** SystemCapability.ArkUI.ArkUI.Full
22
23### makeNode
24
25abstract makeNode(uiContext : UIContext): FrameNode | null
26
27当实例绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)创建的时候进行回调。回调方法将返回一个节点,将该节点挂载至[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)。
28或者可以通过NodeController的rebuild()方法进行回调的触发。
29
30**系统能力:** SystemCapability.ArkUI.ArkUI.Full
31
32**参数:**
33
34| 参数名    | 类型                                      | 必填 | 说明                                                                                                          |
35| --------- | ----------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------- |
36| uiContext | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 回调该方法时候,绑定[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)的UI上下文。 |
37
38**返回值:**
39
40| 类型             | 说明                                                                                                                                                                                                                                                        |
41| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
42| [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)的子节点。 |
43
44### aboutToAppear
45
46aboutToAppear?(): void
47
48当NodeController绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)挂载显示时触发此回调。
49
50**系统能力:** SystemCapability.ArkUI.ArkUI.Full
51
52### aboutToDisappear
53
54aboutToDisappear?(): void
55
56当NodeController绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)卸载消失时触发此回调。
57
58**系统能力:** SystemCapability.ArkUI.ArkUI.Full
59
60### aboutToResize
61
62aboutToResize?(size: Size): void
63
64当NodeController绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)布局的时候触发此回调。
65
66**系统能力:** SystemCapability.ArkUI.ArkUI.Full
67
68**参数:**
69
70| 参数名 | 类型                                     | 必填 | 说明                                     |
71| ------ | ---------------------------------------- | ---- | ---------------------------------------- |
72| size   | [Size](./js-apis-arkui-graphics.md#size) | 是   | 用于返回组件布局大小的宽和高,单位为vp。 |
73
74### onTouchEvent
75
76onTouchEvent?(event: TouchEvent): void
77
78当NodeController绑定的[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)收到Touch事件时触发此回调。
79
80**系统能力:** SystemCapability.ArkUI.ArkUI.Full
81
82**参数:**
83
84| 参数名 | 类型                                                                      | 必填 | 说明       |
85| ------ | ------------------------------------------------------------------------- | ---- | ---------- |
86| event  | [TouchEvent](arkui-ts/ts-universal-events-touch.md#touchevent对象说明) | 是   | 触摸事件。 |
87
88### rebuild
89
90rebuild(): void
91
92调用此接口通知[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)组件重新回调[makeNode](#makenode)方法,更改子节点。
93
94**系统能力:** SystemCapability.ArkUI.ArkUI.Full
95
96### 示例
97
98```ts
99import { UIContext } from '@ohos.arkui.UIContext';
100import { NodeController, BuilderNode, Size, FrameNode } from '@ohos.arkui.node';
101
102class Params {
103  text: string = "this is a text"
104}
105
106@Builder
107function buttonBuilder(params: Params) {
108  Column() {
109    Button(params.text)
110      .fontSize(12)
111      .borderRadius(8)
112      .borderWidth(2)
113      .backgroundColor(Color.Orange)
114  }
115}
116
117class MyNodeController extends NodeController {
118  private buttonNode: BuilderNode<[Params]> | null = null;
119  private wrapBuilder: WrappedBuilder<[Params]> = wrapBuilder(buttonBuilder);
120
121  makeNode(uiContext: UIContext): FrameNode {
122    if (this.buttonNode == null) {
123      this.buttonNode = new BuilderNode(uiContext);
124      this.buttonNode.build(this.wrapBuilder, { text: "This is a Button" })
125    }
126    return this.buttonNode!.getFrameNode()!;
127  }
128
129  aboutToResize(size: Size) {
130    console.log("aboutToResize width : " + size.width + " height : " + size.height)
131  }
132
133  aboutToAppear() {
134    console.log("aboutToAppear")
135  }
136
137  aboutToDisappear() {
138    console.log("aboutToDisappear");
139  }
140
141  onTouchEvent(event:TouchEvent) {
142    console.log("onTouchEvent");
143  }
144}
145
146@Entry
147@Component
148struct Index {
149  private myNodeController: MyNodeController = new MyNodeController();
150
151  build() {
152    Column() {
153      NodeContainer(this.myNodeController)
154    }
155    .padding({ left: 35, right: 35, top: 35 })
156    .width("100%")
157    .height("100%")
158  }
159}
160```
161![patternlock](figures/node_controller.jpg)