gpt4 book ai didi

ember.js - 为什么我的跟踪阵列在 Ember Octane 中没有更新?

转载 作者:行者123 更新时间:2023-12-02 06:06:33 27 4
gpt4 key购买 nike

我正在试用 Octane,出于某种原因,如果我在模板中显示一个数组并向其中添加一个新对象,则 UI 不会更新。我究竟做错了什么?

这是我的模板:

<label for="new-field-name">Field Name</label>
<Input id="new-field-name" @value={{this.newFieldName}} type="text" />
<button {{on "click" this.addField}}>Add field</button>

{{#each this.fields as |field|}}
<p>{{field.name}}</p>
{{/each}}

和组件:
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';

export default class ConfigControlsComponent extends Component {
@tracked fields = []
@tracked newFieldName = ''

@action addField() {
this.fields.push({
name: this.newFieldName
})
console.log(this.fields)
}
}
console.log显示添加了新对象的数组,以及 fields数组被跟踪,但当我单击按钮时没有任何变化。

最佳答案

当您使用 tracked对于数组,您需要“重置”数组,以便 Ember 注意到发生了变化。尝试做 this.fields = this.fields将新对象插入数组后。

编辑:一些短绒将防止自我分配。因此,相反,我们可以从不变性模式中提取,并使用新数组进行设置,如下所示。

export default class ConfigControlsComponent extends Component {
@tracked fields = []
@tracked newFieldName = ''

@action addField() {
// add this line
this.fields = [...this.fields, {
name: this.newFieldName
}];
}
}

如果您尝试使用 tracked使用对象而不是数组,您有两个选择:

首先,您可以创建一个类来跟踪对象上的所有属性:
import { tracked } from '@glimmer/tracking';

class Address {
@tracked street;
@tracked city;
}

class Person {
address = new Address();

get fullAddress() {
let { street, city } = this.address;

return `${street}, ${city}`;
}
}

或者,其次,您可以使用与上面的数组示例相同的“重置”方法。

关于ember.js - 为什么我的跟踪阵列在 Ember Octane 中没有更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57468327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com