我有一条加载仪表板的路线
// routes/dashboard/index.js
...
model: function(params) {
return this.store.find('dashboard', params.dashboard_id);
}
...
仪表板模型包含与窗口小部件模型的hasMany关系
// models/dashboard.js
...
DS.Model.extend({
widgets: hasMany('widget', {async: true})
...
小部件模型包含与仪表板模型
的belongsTo关系// models/widget.js
...
DS.Model.extend({
dashboard: belongsTo('dashboard', {async: true})
...
dashboard.index模板使用{{each}}帮助程序
呈现窗口小部件// templates/dashboard/index.js
...
{{#each model.widgets as |widget|}}
{{widget config="widget"}}
{{/each}}
...
用户可以将小部件添加到其信息中心
// routes/dashboard/index.js
...
actions: {
addWidget: function() {
this.store.createRecord('widget', {
dashboard: this.modelFor('dashboard.index')
...
});
}
}
虽然这样可行,但在创建新窗口小部件时,将重新呈现所有窗口小部件。
有些注意事项: - 我没有实现View或Controller。 - 如果我改变实现只返回一个小部件集合,导致ember-cli创建一个ArrayController而不是ObjectController,那么每个循环都不会重新渲染(优秀)。但是,仪表板有多个需要渲染的子数组,所以我不能采用这种方法。 - 尽管努力实现对象控制器并创建我自己的阵列控制器,但我无法在这里获得相同的功能。
关于如何在不重新渲染所有小部件的情况下添加小部件的任何建议?