ember.js 如何从Ember路由模型挂钩传递@tracked对象

oiopk7p5  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(235)

我的问题有两个方面:
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中深入探讨的。

frebpwbc

frebpwbc1#

你在模型钩子中返回了一个对存储在this.recent中的对象的引用。但是getRecent方法并没有改变那个对象,而是覆盖了this.recent。在第一次执行getRecent方法之后,路线的模型和this.recent不再是同一个对象。路线的模型,可以通过this.modelFor(this.routeName)访问的值是初始值,this.recent是新值。
您需要改变从模型挂接返回的对象。
示例中给出的对象具有固定架构。这允许您将属性A标记为跟踪:

recent: {
    @tracked A: 0,
    ...
  }

现在你在模型钩子中返回this.recent的值,但不是在getRecent方法中覆盖它,你只是改变了它的属性A的值:

getRecent() {  
    this.recent.A = <some new value fetched>;

    later(this, this.getRecent, 2000);
  }

如果你不知道model hook返回的对象的模式,或者你正在处理一个数组,这就有点复杂了。你不会有一个用@tracked来修饰的属性。在这种情况下,我建议使用tracked-built-ins包。
对于数组,你也可以从@ember/array/mutable包中回退到传统的MutableArray。但是你必须确保在这种情况下你使用它的自定义方法来操作数组(例如,pushObject而不是push)。

相关问题