Skip to content

Instantly share code, notes, and snippets.

@lukemelia
Created May 15, 2015 19:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lukemelia/fc8e06163a46f428fd39 to your computer and use it in GitHub Desktop.
Save lukemelia/fc8e06163a46f428fd39 to your computer and use it in GitHub Desktop.
mixins/image-load.js
import Ember from 'ember';
var on = Ember.on;
var set = Ember.set;
var run = Ember.run;
var Mixin = Ember.Mixin;
var computed = Ember.computed;
var getWithDefault = Ember.getWithDefault;
export default Mixin.create({
imageLoaded: false,
imageLoadFailed: false,
imageLoadSelector: 'img',
classNameBindings: ['imageLoaded:image-loaded:image-not-loaded', 'imageLoadFailed'],
defaultErrorText: computed('errorText', function() {
return getWithDefault(this, 'errorText', 'Image failed to load');
}),
_resolveImage: on('didInsertElement', function() {
var component = this;
var imageLoadSelector = this.get('imageLoadSelector');
var image = component.$(imageLoadSelector);
var isCached = image[0].complete;
if (!isCached) {
image.on('load', function() {
component._imageLoaded();
});
image.on('error', function(error) {
component._imageError(error);
});
} else {
this._imageLoaded();
}
}),
_imageLoaded: function() {
var component = this;
run(function() {
set(component, 'imageLoaded', true);
});
},
_imageError: function() {
var component = this;
run(function() {
set(component, 'imageLoadFailed', true);
});
},
willDestroyElement: function() {
var imageLoadSelector = this.get('imageLoadSelector');
this.$(imageLoadSelector).off('load');
this.$(imageLoadSelector).off('error');
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment