Ember.js 余烬:重新渲染路线';在模型更改时创建模板

Ember.js 余烬:重新渲染路线';在模型更改时创建模板,ember.js,ember-data,ember-cli,Ember.js,Ember Data,Ember Cli,我注意到,当模型发生更改时(即,转换到具有不同模型的同一路线上),路线不会重新渲染。我在一个特定的页面上设置了一些jQuery插件,我需要它们在模型更改时重新呈现,所以它看起来是一个新页面 有办法做到这一点吗?也许通过观察模型的ID并以某种方式重新渲染路线 提前感谢我有一个方法,我相信它能满足您的需求,但首先我想说的是,没有简单的方法可以满足您的要求,因为它与水疗的设计目的相反 数据绑定(无需刷新视图)通常是SPA的一大好处,SPA努力避免强行重新加载/刷新/重新提交视图。我花了一段时间才找到你

我注意到,当模型发生更改时(即,
转换到具有不同模型的同一路线上),路线不会重新渲染。我在一个特定的页面上设置了一些jQuery插件,我需要它们在模型更改时重新呈现,所以它看起来是一个新页面

有办法做到这一点吗?也许通过观察模型的ID并以某种方式重新渲染路线

提前感谢

我有一个方法,我相信它能满足您的需求,但首先我想说的是,没有简单的方法可以满足您的要求,因为它与水疗的设计目的相反

数据绑定(无需刷新视图)通常是SPA的一大好处,SPA努力避免强行重新加载/刷新/重新提交视图。我花了一段时间才找到你的问题的解决方案,因为它似乎违背了余烬的设计原则。即使像这样的钩子也意味着更新模型和绑定数据,而不是重新加载模板

与前面的问题相同,似乎大多数答案引导用户使用而不是刷新整个视图。通常,刷新视图的理想是一种错误的假设

根据前面的示例,我建议您的目标不应该是完全刷新模板,而是找出如何使jQuery插件更好地适应单页应用程序/客户端JS友好设计,并将其作为路由生命周期的自然部分重新加载

例如,该插件可以在或类似的地方重新加载/重置/重新运行

这就是说,我可以使用(在我看来,一个hack
Ember.run.later()
来完成您要求的操作,这样我就可以使
if
块无效,并强制内容重新播放。注意,这通常不是用户想要的,因为(除了设计原则原因)它会导致UI闪烁

我有一个这样的组件

/* will-rerender.hbs */
{{#if show}}
    {{yield}}
{{/if}}
它有一个类似这样的JS文件

/* will-rerender.js */
import Ember from 'ember';

export default Ember.Component.extend({
  show: false,

  didReceiveAttrs() {
    this._super(...arguments);

    /* 
      Ugly hack, but we need to reset `show` in
      a separate run loop in order to force the view
      to rerender.
    */

    this.set('show', false);

    Ember.run.later(() => {
      this.set('show', true);
    });
  }
});
你可以这样调用它

/* your template */
{{#will-rerender cacheKey=model.id}}
   ... your content to rerender ...
{{/will-rerender}}
每当
model.id
更改时,组件将调用
didReceiveAttrs()
导致
show
无效并刷新视图


顺便说一句,我认为使用
{{{link to}}
在模型之间切换的行为会更自然,而不是自己调用
transition

我不确定我是否理解这个问题。您的意思是希望在模型更改时重新渲染管线吗?因此,您希望执行类似model.save()的操作,然后重新加载页面以重新运行jQuery插件?你的jQuery插件中有钩子吗?你能做一些类似于
model.save()。然后(()=>/*jQueryPlugin.refresh()/*})
的事情吗?我只需要在输入路由时重新加载模板,而不管之前的路由是什么。当前的Ember功能是,如果您使用不同的模型转换到同一路线,则只更新数据绑定-视图不会重新呈现。啊,对不起,我的错误。我以为你是说数据绑定由于某种原因没有更新。我现在明白了。您不仅希望更新数据绑定,还希望重新呈现整个模板。感谢这个示例,我们将。我认为,组件需要重新渲染的原因是它们实际上加载了数据,这可以更好地描述我的情况。其中一些是图表(Chart.js),它们自己获取数据,而不是从路由获取给定数据。我认为你的解决方案仍然有效,但我想知道,如果你有更多的见解,是否会产生一个更优雅的解决方案。亚当,谢谢你提供了更多的背景。如果最终目标是为图表重新加载数据,那么使用?您可以在组件或控制器中绑定一个操作来更新Chart.js数据数组。Will,我确实成功地使用了更新数据API,与
ember diff attrs
和观察模型ID的计算函数相结合。感谢您的帮助!令人惊叹的!很高兴听到你成功了,亚当。