这是我为 AngularJS 编写的第一个指令。我想检查插入到文本输入中的图像 url 是否有效。
这就是我到目前为止所拥有的:
angular.module('directives', [])
.directive('imageUrlVerify', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ctrl) {
var image = new Image();
scope.$watch(function() {
if (ctrl.$viewValue) {
image.src = ctrl.$viewValue;
if (image.complete) {
scope[attrs.imageValid] = true;
} else {
scope[attrs.imageValid] = false;
}
} else {
scope[attrs.imageValid] = false;
}
});
}
}
})
我用它:
<input type="text" ng-model="imageUrl" placeholder="Image URL..." data-image-valid="imageOk" image-url-verify>
这实际上是有效的,但作为我的第一个指令,我想确保我以正确的方式做事......
我错过了什么吗?
编辑:按照@Josh-David-Miller 的回答我想出了这个:
angular.module('directives', [])
.directive('imageUrlVerify', function() {
return {
restrict: 'A',
replace: true,
scope: { url: '=', imageValid: '=' },
template: '<input ng-model="url" placeholder="Image URL..."/>',
link: function(scope, element, attrs) {
var image = new Image();
scope.$watch('url', function() {
scope.imageValid = false;
});
element.on( 'blur', function() {
image.src = scope.url;
});
image.onload = function() {
scope.$apply(function() {
scope.imageValid = true;
});
};
image.onerror = function() {
scope.$apply(function() {
scope.imageValid = false;
});
};
}
}
})
并像这样使用它:
<input image-url-verify url="imageUrl" image-valid="imageOk" />
它看起来更好吗?还有什么地方可以改进?