问题
I'm trying to use JCrop with AngularJS. I have the following directive that I need help to fix a bit:
.directive('imgCropped', function() {
return {
restrict: 'E',
replace: true,
scope: { src:'@', selected:'&' },
link: function(scope,element, attr) {
var myImg;
var clear = function() {
if (myImg) {
myImg.next().remove();
myImg.remove();
myImg = undefined;
}
};
scope.$watch('src', function(nv) {
clear();
if (nv) {
element.after('<img />');
myImg = element.next();
myImg.attr('src',nv);
$(myImg).Jcrop({
trackDocument: true,
onSelect: function(x) {
/*if (!scope.$$phase) {
scope.$apply(function() {
scope.selected({cords: x});
});
}*/
scope.selected({cords: x});
},
aspectRatio: 1,
boxWidth: 400, boxHeight: 400,
setSelect: [0, 0, 400, 400]
});
}
});
scope.$on('$destroy', clear);
}
};
})
the problem is that JCrop doesn't detect the true image size correctly and I need to add a trueSize option, the only way that I know how to do is to wrap the Jcrop invocation in a callback, looks pretty nasty.
also, if I use scope.$apply in the onSelect callback I get the $digest already in progress error. why is that ?
EDIT: I can successfully get the true image size with the following code, but there must be a better way to do so
.directive('imgCropped', function() {
return {
restrict: 'E',
replace: true,
scope: { src:'@', selected:'&' },
link: function(scope,element, attr) {
var myImg;
var clear = function() {
if (myImg) {
myImg.next().remove();
myImg.remove();
myImg = undefined;
}
};
scope.$watch('src', function(nv) {
clear();
if (nv) {
element.after('<img />');
myImg = element.next();
myImg.attr('src',nv);
var temp = new Image();
temp.src = nv;
temp.onload = function() {
var width = this.width;
var height = this.height;
$(myImg).Jcrop({
trackDocument: true,
onSelect: function(x) {
/*if (!scope.$$phase) {
scope.$apply(function() {
scope.selected({cords: x});
});
}*/
scope.selected({cords: x});
},
aspectRatio: 1,
boxWidth: 400, boxHeight: 400,
setSelect: [0, 0, 400, 400],
trueSize: [width, height]
});
}
}
});
scope.$on('$destroy', clear);
}
};
})
回答1:
What you're doing is probably fine. The directive looks okay. As far as getting the image size, you can do it with straight JavaScript like so:
var img = new Image();
img.onload = function () {
var w = img.width,
h = img.height;
//do what you need to do here.
};
img.src = 'somefile.gif';
It will save you the DOM manipulation.
回答2:
I'm working on a directive that I'll be pushing to bower (after a few more fixes):
angular-image-crop
working demo
In the constructor callback, I call this.getBounds()
and then I apply those values to the cords
in onSelect
:
https://github.com/coolaj86/angular-image-crop/blob/master/app/scripts/controllers/profile-pic.js#L24
来源:https://stackoverflow.com/questions/14504393/how-to-fix-this-angularjs-jcrop-directive