Ember.js组件重新渲染而不是重新渲染

时间:2017-03-30 10:28:11

标签: ember.js

我试图将一些数据渲染到表格中。数据按年份组织,用户可以在索引中添加年份。

当用户添加一年时,该年份的数据将通过AJAX加载并添加到Ember.Object info,如下所示:

var self=this;
Ember.$.getJSON('url'+year, function(data) {
  var info = self.get("info");
  info['total'][year] = data.total;
  info['commission'][year] = data.commission;
}

在模板中,数据通过each-in助手显示:

{{#each-in info.total as |k t|}}
  {{t}}
{{/each-in}}

根据手册here,由于each-in未绑定到新属性,因此我在组件中的ajax分配后添加了self.rerender();

我的问题是组件没有重新渲染。如果我更改路线并返回,则会重新呈现页面并显示数据,因此问题显然在rerender()调用上。

PS:这里显示的代码是一个简化的例子;有必要使用each-in的原因,任何需要更改数据结构的解决方案都不会有帮助。我只需要知道为什么rerender()没有重新渲染以及如何让它这样做。

2 个答案:

答案 0 :(得分:4)

由于glimmer 2,您无需为rerender循环调用each-in

现在您可以创建新对象,但更快的解决方案是使用Ember.set而不是[]语法。所以替换这个:

info['total'][year] = data.total;

用这个:

Ember.set(info, `total.${year}`, data.total);

它会起作用。

如果您拒绝这样做,请致电notifyPropertyChange。但是Ember.set是首选。

结帐this twiddle

答案 1 :(得分:2)

你的Ember版本是什么?您提供的指南是2.6.0,但是在Ember 2.6.0上运行的以下twiddle似乎正在运行。然而;在Glimmer 2介绍之后(我的意思是自2.10.0版本开始)这似乎不起作用。正如您在2.10.0指南中所看到的,删除了解释重新渲染的部分。因此,这意味着你无法以同样的方式达到你想要的目标。

如果使用each-in帮手是必须的;你可以查看以下{Ember 2.12.0运行的twiddle并且仍然有效。而不是通过组件内的self.rerender强制重新呈现;你可以像Lux所说的那样依赖Ember' set。我更新了一下以反映这一点。