HarmonyOS 鸿蒙Next 多重嵌套的模型属性监听

发布于 1周前 作者 sinazl 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 多重嵌套的模型属性监听

一个多重嵌套的model,该如何在controller里面监听到这个model的属性值发生改变啊?

2 回复

参考demo:

class ClassA {
  a: number;
  b: ClassB;
  constructor(a: number) {
    this.a = a;
    this.b = new ClassB(a + 2, 2 * a);}
  getA(): number {return this.a; }
  setA(a: number): void {this.a = a;}}
@Observed
class ClassC {
  c: number;
  constructor(c: number) {this.c = c;}
  getC(): number {return this.c;}
  setC(c: number): void {this.c = c; }}
@Observed
class ClassB {
  b: number = 47;
  c: ClassC;
  constructor(b: number, c: number) {
    this.b = b;
    this.c = new ClassC(c);}
  getB(): number {
    return this.b; }
  setB(b: number): void {
    this.b = b;}
  getC(): number {
    return this.c.getC();}
  setC(c: number): void {
    return this.c.setC(c);
  }}
@Component
struct ViewClassB {
  @ObjectLink b: ClassB;
  build() {
    Column({ space: 10 }) {
      Text(`b: ${this.b.getB()}`)
      Button("5 Change B")
        .onClick(() => {
          this.b.setB(this.b.getB() + 1);
        })}}}
@Component
struct ViewClassC {
  @ObjectLink c: ClassC;
  build() {
    Column({ space: 10 }) {
      Text(`c: ${this.c.getC()}`)
      Button("4 Change C")
        .onClick(() => {
          this.c.setC(this.c.getC() + 1);
        }) }}}
@Entry
@Component
struct MyView {
  // 对象包含关系:A对象(B对象(C对象))
  @State a: ClassA = new ClassA(10); //10,12,20
  build() {
    Column({ space: 10 }) {
      Text(`c: ${this.a.b.c.c}`)
      Button("1 Change ClassC.c")
        .onClick(() => {
          this.a.b.c.c += 1;
        })
      Text(`b: ${this.a.b.b}`)
      Button("2 Change ClassB.b")
        .onClick(() => {
          this.a.b.b += 1;
        })
      // 改变A对象下a属性时可以触发@State A对象数据刷新,因此会出现先按了4,5按钮后123上数据由于处于对象内对象无法更新,点击了3触发@StateA对象内部数据变更会触发对象数据刷新
      Text(`b: ${this.a.a}`)
      Button("3 Change ClassA.a")
        .onClick(() => {
          this.a.a += 1;
        })
      //A对象下B对象,C对象均建议使用子组件+[@ObjectLink](/user/ObjectLink)来使用
      ViewClassC({ c: this.a.b.c }) // Text(`c: ${this.b.c.c}`)的替代写法
   ViewClassB({ b: this.a.b })   }}}

可以参考使用[@Observed](/user/Observed)+[@ObjectLink](/user/ObjectLink)属性来实现

更多关于HarmonyOS 鸿蒙Next 多重嵌套的模型属性监听的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,处理多重嵌套的模型属性监听,可以通过数据绑定和观察者模式实现。鸿蒙系统提供了丰富的组件和API来支持复杂的数据流管理。

对于多重嵌套的模型,首先确保你的数据模型遵循可观察性原则。你可以使用@ObservedObject或相应的数据绑定机制,将模型绑定到UI组件上。在嵌套模型中,每个层级的数据变化都可以通过观察者模式触发相应的UI更新。

具体来说,当内层模型的属性发生变化时,该变化会向上层传播,直至触发UI组件的重新渲染。鸿蒙的响应式框架会监听这些变化,并自动更新绑定的视图。

要实现这一点,你可以在数据模型中使用@Published或类似的属性包装器来标记需要监听的属性。这些属性在变化时会通知绑定的视图进行更新。

例如,如果你有一个用户模型,其中包含地址模型,而地址模型又包含城市、街道等属性,你可以在每个层级上设置监听,确保任何属性的变化都能被捕获并反映到UI上。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部