Ember.js仅对重新渲染器执行

Ember.js仅对重新渲染器执行,ember.js,retina.js,Ember.js,Retina.js,我正在尝试将retina.js与Ember一起使用,但遇到了一个问题。如果存在@2x版本,Retina.js将使用@2x版本替换img元素,并且只在刷新页面时执行一次。显然,我可以循环使用img元素,并为AJAX响应创建一个新的RetinaImage实例,它似乎也可以用于呈现余烬视图,但问题是,它在最初加载页面时会执行两次。我已经查看了didInsertElement,但它会在插入视图并重新渲染时触发。有没有办法只限制新的RetinaImage(此)查看重播 相关代码: Ember.View.r

我正在尝试将retina.js与Ember一起使用,但遇到了一个问题。如果存在@2x版本,Retina.js将使用@2x版本替换img元素,并且只在刷新页面时执行一次。显然,我可以循环使用img元素,并为AJAX响应创建一个新的RetinaImage实例,它似乎也可以用于呈现余烬视图,但问题是,它在最初加载页面时会执行两次。我已经查看了didInsertElement,但它会在插入视图并重新渲染时触发。有没有办法只限制新的RetinaImage(此)查看重播

相关代码:

Ember.View.reopen({
  didInsertElement: function() {
    this._super();
    $('img').each(function() {
      new RetinaImage(this);
    });
  }
});

这样做的问题是,注入页面的每个视图都会对每个图像运行此代码,您可能会在一个图像上运行视网膜图像100次。您确实应该将它集中到插入图像的每个实例

假设Foo视图有一些图像,您可以这样做:

App.ImageView = Ember.View.extend({
  setupRetina: function() {
    this.$('img').each(function() {
      new RetinaImage(this);
    });
  }.on('didInsertElement')
});
或者更好的方法是用它创建一个组件:

App.RetinaImageComponent = Ember.Component.extend({
  setupRetina: function() {
    this.$('img').each(function() {
      new RetinaImage(this);
    });
  }.on('didInsertElement')
});

您可以在此处阅读有关组件的更多信息:

感谢您提醒您有关视图和组件的信息。尽管如此,如果有人刷新带有视图/组件的页面,依赖didInsertElement会导致代码运行两次。是否有办法仅在视图重新提交或路由转换到时运行此代码?基本上,我不想在将视图插入DOM时执行这段代码,只想重新加载。我不确定这是一条正确的语句。你能举个例子吗?这里有一个相反的例子:,你说只在rerender上做是什么意思?我猜这是关于Retina.js如何编写的问题。Retina.js被包装在一个iLife中,因此运行它不需要额外的调用。因此,当用户加载页面时,Retina.js将立即使用2x版本交换图像,并相应地设置宽度和高度。正因为如此,我经历了从初始页面加载的交换,然后执行新的视网膜图像(此)将再次交换2x版本与2x版本,从而使用2x图像的实际宽度和高度,而不是非视网膜图像。在下一条评论中继续。查看此内容如果您在本地保存此内容,您可以看到控制台尝试再次调用2x2x映像。我在本地保存了它,它运行了3次,每幅图片一次:/