【问题标题】:EmberJS: refreshing a data model does not update associated computed propertiesEmberJS:刷新数据模型不会更新关联的计算属性
【发布时间】:2018-02-22 23:09:22
【问题描述】:

假设有一条路由可以在用户请求时更新其数据(假设后端为同一个调用返回不同的数据,可能是股票数据,或者只是随机数)。

export default Ember.Route.extend({
  model() {
    return this.get('store').findAll('foo');
  },

  actions: {
    invalidateModel() {
      this.refresh();
    }
  }
});

现在,直接使用此模型的组件将按预期更新其视图。

Model: {{#each model as |m|}}{{m.bar}}{{/each}}
<button {{action "refreshModel"}}>Refresh model</button>

但是,如果组件正在使用观察模型的计算属性,则更新不会进行。

模板

Model: {{#each computedModel as |m|}}{{m}}{{/each}}
<br>
<button {{action "refreshModel"}}>Refresh model</button>

组件

computedModel: Ember.computed('model', function() {
  return this.get('model').map(function(m) {
    return `Computed: ${m.data.bar}`;
  });
}),

如需完整重现,您可以查看:https://github.com/myartsev/ember-computed-properties-on-data-model

最新的提交是非工作计算属性的情况。
previous commit 表示在直接使用模型时一切正常。

我错过了什么?

【问题讨论】:

    标签: ember.js


    【解决方案1】:
    computedModel: Ember.computed('model.@each.bar', function() {
      return this.get('model').map(function(m) {
        return `Computed: ${m.data.bar}`
      });
    })
    

    关闭循环; @Subtletree 的答案非常接近,它让我在正确的轨道上思考。

    区别很微妙但很重要,model.[] 仅在返回的数据大小发生变化时才有效;添加或删除元素。就我而言,返回的数据大小保持不变,只是它的值得到了更新。所以正确的方法是听你正在寻找的依赖键,在这种情况下,'model.@each.bar'。

    【讨论】:

      【解决方案2】:

      您的计算属性正在监听数组本身的变化。尝试使用 model.[] 监听数组项的更改

      https://guides.emberjs.com/v2.15.0/object-model/computed-properties-and-aggregate-data/#toc_code-code-vs-code-each-code

      computedModel: Ember.computed('model.[]', function() {
        return this.get('model').map(function(m) {
          return `Computed: ${m.data.bar}`;
        });
      }),
      

      更新

      Here is a twiddle 表明上述解决方案解决了问题。

      如果它对您不起作用,那么您的 api 返回的内容存在一些问题。

      根据我的 cmets 关于如何发送操作的信息。您使用的是我不熟悉的 2 岁的 syntax from Ember 1.13

      我建议你阅读the docs for the version you are running Ember 2.15

      【讨论】:

      • 如果你还没有加入 ember slack,你也应该加入。 ember-community-slackin.herokuapp.com :)
      • 你试过了吗?它不起作用:( ember 数据模型是一个类,而不是数组,至少不是直接的(它在类内部确实有数组)
      • 您没有将操作正确发送到组件,您只是发送了一个字符串。试试{{foo-component model=model invalidateModel=(action "invalidateModel")}}
      • 默认情况下您不能将路由操作发送到模板,只能从控制器或组件发送操作。您可以使用 ember-route-action-helper 插件从路由发送操作
      • 组件的动作在路由中触发得很好,请阅读问题并尝试运行示例。行动增加,数据减少。
      猜你喜欢
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      相关资源
      最近更新 更多