HarmonyOS 鸿蒙Next @ObjectLink + JSON 不生效
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
通过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的使用方式有关。以下是一些可能的原因及检查点:
-
数据绑定问题:确保您的数据模型正确实现了
@ObjectLink
注解,并且JSON数据能够正确映射到数据模型的属性上。检查数据模型的字段名与JSON中的键名是否完全一致。 -
JSON格式错误:验证JSON数据的格式是否正确,包括属性名是否使用双引号、数组和对象的括号是否正确闭合等。
-
API使用不当:确认您使用的API方法是否支持
@ObjectLink
注解。有些API可能只支持基本的数据类型或特定的数据绑定方式。 -
系统限制或Bug:检查您使用的HarmonyOS版本是否支持该特性,或者是否存在已知的Bug。
-
编译环境问题:确保您的开发环境(如IDE、SDK版本)配置正确,且已更新到支持该特性的版本。
如果上述检查后问题依旧没法解决,请联系官网客服。官网地址是:https://www.itying.com/category-93-b0.html ,他们将能提供更专业的技术支持。