HarmonyOS 鸿蒙Next @ObjectLink + JSON 不生效

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

HarmonyOS 鸿蒙Next @ObjectLink + JSON 不生效

在文件的代码中,当BasicDataSource中的originDataArray数据来源,来自JSON(网络请求)as T 转换,List中onClick改变item的属性值,列表不会触发刷新。
将所有对象重新进行如下操作之后,可以正常刷新 (或者数据源本身就是直接new出来)

//typescript
let newUsers:User[] = []
data.users?.forEach((item:User) => {
let newUser = new User(item) //重新赋值
newUsers.push(newUser)
}) 


更多关于HarmonyOS 鸿蒙Next @ObjectLink + JSON 不生效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

通过JSON.parse得到的对象并不是通过User构造出的实例,其数据变化无法被观测到,所以不能实现ui刷新

可以通过引入三方库 reflect-metadata class-transformer,参考如下demo实现

// test.ts :
export let jsonString: Record<string, ESObject> = {
 "data": [
   {
     "number": 1,
     "age": 20,
     "testA": {
       "str": "123"
     }
   },
   {
     "number": 2,
     "age": 21,
     "testA": {
       "str": "456"
     }
   }
 ]
}

// Index.ets
import { Type, plainToClass } from 'class-transformer'
import 'reflect-metadata'
import { jsonString } from './test'
import { TestA, Person, ViewA } from './ViewA';

class ResponseObj {
 [@Type](/user/Type)(() => Person)
 data: Person[] = [];
}

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
 [@State](/user/State) list: Person[] = [];
 [@State](/user/State) message: string = 'Click me';

 build() {
   Row() {
     Column() {
       Text(this.message).fontSize(40).onClick(() => {
         let responseObj: ResponseObj = plainToClass(ResponseObj, jsonString);
         console.log(` ${responseObj.data[0] instanceof Person}`)
         this.list = this.list.concat(responseObj.data);
       })
       ForEach(this.list, (item: Person, index: number) => {
         ViewA({
           index: index,
           test
           item
           .
           testA
         })
       })
     }
     .width('100%')
   }
   .height('100%')
 }
}

// ViewA.ets
import { Type } from 'class-transformer'

[@Observed](/user/Observed)
export class TestA {
 public str: string

 constructor(str: string) {
   this.str = str;
 }
}

export class Person {
 name: string = ''
 age: number = 1
 [@Type](/user/Type)(() => TestA)
 test
 TestA = new TestA('')
}

[@Component](/user/Component)
export struct ViewA {
 [@ObjectLink](/user/ObjectLink) test
 TestA
 index: number = -1;

 build() {
   Row() {
     Button(`View A ${this.testA.str}`).onClick(() => {
       this.index += 1;
       this.testA.str = `${this.index} : Test A String`
     })
   }.margin({ top: 10 })
 }
}

更多关于HarmonyOS 鸿蒙Next @ObjectLink + JSON 不生效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对您提到的HarmonyOS鸿蒙系统中使用@ObjectLink + JSON不生效的问题,这通常可能与数据绑定、JSON格式、或者系统API的使用方式有关。以下是一些可能的原因及检查点:

  1. 数据绑定问题:确保您的数据模型正确实现了@ObjectLink注解,并且JSON数据能够正确映射到数据模型的属性上。检查数据模型的字段名与JSON中的键名是否完全一致。

  2. JSON格式错误:验证JSON数据的格式是否正确,包括属性名是否使用双引号、数组和对象的括号是否正确闭合等。

  3. API使用不当:确认您使用的API方法是否支持@ObjectLink注解。有些API可能只支持基本的数据类型或特定的数据绑定方式。

  4. 系统限制或Bug:检查您使用的HarmonyOS版本是否支持该特性,或者是否存在已知的Bug。

  5. 编译环境问题:确保您的开发环境(如IDE、SDK版本)配置正确,且已更新到支持该特性的版本。

如果上述检查后问题依旧没法解决,请联系官网客服。官网地址是:https://www.itying.com/category-93-b0.html ,他们将能提供更专业的技术支持。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!