Gre*_*x L 3 ember.js glimmer.js ember-octane
所以我的情况如下:我得到了一个包含几个输入字段的组件,这些输入字段代表一个联系人并填充了来自服务的数据:
@service('contact-data') contact;
Run Code Online (Sandbox Code Playgroud)
每个字段代表一个通过访问的属性
{{contact.properties.foo}}
Run Code Online (Sandbox Code Playgroud)
我将属性保存为 JS 对象,以便在使用它们时轻松过滤掉空字段,并使用@tracked如下方式跟踪它:
{{contact.properties.foo}}
Run Code Online (Sandbox Code Playgroud)
但是,属性不会在组件中正确重新呈现,并且文本字段不会更新。
我将不胜感激!谢谢!
任何时候你有一堆需要跟踪的嵌套状态,只跟踪顶级对象不会导致对该对象内部的更新传播出去。您需要跟踪内部属性,或者您需要重置您正在跟踪的整个对象。
您基本上有两个粗略的选项来处理这些内部属性的更新:
@tracked字段的实用程序类中,并在创建服务时实例化该实用程序类。然后对这些字段的更新将更新。this.properties = { ...this.properties, foo: newValue };其中,(1) 几乎总是最便宜且性能最好的。做 (2.1) 会有点贵,因为它需要使用 a Proxy,但还不够,你通常会注意到。执行 (2.2) 最终将触发应用程序中任何地方使用的每个属性的重新渲染properties,即使它没有更改。
在您所描述的情况下,这些字段似乎是众所周知的,这意味着您应该访问该类。解决方案可能如下所示:
import Service from '@ember/service';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';
class TheProperties {
@tracked id;
@tracked foo;
@tracked bar;
}
export default class MyService extends Service {
properties = new TheProperties();
@action updateFoo(newValue) {
this.properties.foo = newValue;
}
@action updateBar(newValue) {
this.properties.bar = newValue;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,@tracked 安装 getter 和 setter 代替普通类属性,因此如果您需要将其用于某处或类似地方的 JSON 有效负载,您还需要toJSON在实用程序类上实现:
class TheProperties {
@tracked id;
@tracked foo;
@tracked bar;
toJSON() {
let { id, foo, bar } = this;
return { id, foo, bar };
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |