2014-06-15 46 views
0

我正在嘗試使用Ember的retina.js,並且遇到問題。如果Retina.js存在,Retina.js會用@ 2x版本替換img元素,並且只有在頁面刷新時纔會這樣做。顯然,我可以通過img元素循環,併爲AJAX響應創建一個新的RetinaImage實例,這似乎也適用於呈現Ember視圖,但問題在於它在頁面最初加載時會執行兩次。我查看了didInsertElement,但是當視圖插入並重新渲染時,它會觸發。有沒有辦法限制新的RetinaImage(這個)來查看退回?Ember.js只執行重新提交

相關代碼:

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

回答

0

用做這種方式的問題,是真實注入頁面將運行這段代碼,對每一個圖像的每一個觀點,你可能會遇到的視網膜圖像上一個100倍圖片。你真的應該把它集中到插入圖像的每個實例上。

想象的是,富觀點有一些圖片,你會做這樣的事情:

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') 
}); 

你可以閱讀更多關於組件的地方:http://emberjs.com/api/classes/Ember.Component.html

+0

感謝您提供有關視圖和組件的提醒。仍然,依靠didInsertElement會導致代碼運行兩次,如果有人用視圖/組件刷新頁面。有沒有辦法只在視圖重新渲染或路由轉換爲?時運行此代碼?基本上我不想在視圖插入DOM時執行此代碼,只能重新渲染。 –

+0

我不確定這是一個真實的陳述。你能舉一個例子嗎?這裏有一個相反的例子:http://emberjs.jsbin.com/cubeninu/1/edit,你是什麼意思,只有在重新執行它? – Kingpin2k

+0

我的猜測是,這是如何編寫Retina.js的問題。 Retina.js被封裝在一個IIFE中,所以它不需要額外的調用來運行。因此,當用戶加載頁面時,Retina.js會立即用2x版本替換圖像,並相應地設置寬度和高度。因此,我正在經歷從初始頁面加載的交換,然後做新的RetinaImage(this)再次用2x版本交換2x版本,從而使用2x圖像的實際寬度和高度,而不是非視網膜圖像。接下來的評論中繼續.. –