我的问题有两个方面:
1.哪里是放置某种轮询逻辑的最佳位置--在路由文件中,对吗?
1.如何将这个不断更新的值从Route传递给某个子组件?将某个变量标记为“@tracked
“,然后通过model
钩子传递跟踪的变量?
假设我有这样的东西:routes/index.js
export default class IndexRoute extends Route {
@tracked
recent: {
A: 0,
...
},
constructor() {
super(...arguments);
this.getRecent();
}
getRecent() {
// poll data / fetch latest
const {A, ...partialObject} = this.recent;
this.recent = { ...partialObject, A: <some new value fetched>};;
later(this, this.getRecent, 2000);
}
model() {
return this.recent;
}
}
application.hbs
<p>constantly updating "this.recent": {{ this.model.A }} </p>
我想如果我像这样使用模型钩子,它会被跟踪,从而自动更新,但事实并非如此。我有一个示例Ember Twiddle,它模拟了我正在尝试做的事情。我试图通过重新分配整个变量来强制重新计算,但它没有工作。
这个问题是从我的initial question here中深入探讨的。
1条答案
按热度按时间frebpwbc1#
你在模型钩子中返回了一个对存储在
this.recent
中的对象的引用。但是getRecent
方法并没有改变那个对象,而是覆盖了this.recent
。在第一次执行getRecent
方法之后,路线的模型和this.recent
不再是同一个对象。路线的模型,可以通过this.modelFor(this.routeName)
访问的值是初始值,this.recent
是新值。您需要改变从模型挂接返回的对象。
示例中给出的对象具有固定架构。这允许您将属性
A
标记为跟踪:现在你在模型钩子中返回
this.recent
的值,但不是在getRecent
方法中覆盖它,你只是改变了它的属性A
的值:如果你不知道model hook返回的对象的模式,或者你正在处理一个数组,这就有点复杂了。你不会有一个用
@tracked
来修饰的属性。在这种情况下,我建议使用tracked-built-ins
包。对于数组,你也可以从
@ember/array/mutable
包中回退到传统的MutableArray
。但是你必须确保在这种情况下你使用它的自定义方法来操作数组(例如,pushObject
而不是push
)。