使用 ng-src 时如何在 Angular 指令中访问 src 属性
How to access src attribute within Angular directive when using ng-src
我有以下 HTML(在 gsp 内):
<img ng-src="${resource(dir: '')}/images/stores/closeBTN.svg" />
我想使用 Modernizr 检测是否支持 SVG,如果不支持则将图像切换为 png。我已经修改了这个指令:https://github.com/tinacious/angular-svg-png
angular.module('svgPng', [])
.directive('img', function () {
return {
restrict: 'E',
link: function (scope, elem, attrs) {
if ( typeof Modernizr !== 'undefined' && !Modernizr.svg ) {
elem.attr('src', attrs.src.replace('.svg', '.png'));
}
}
};
});
问题是 attrs.src 未定义,因此替换不起作用。我知道 ng-src 应该填充 src,所以我是否需要强制摘要循环或其他东西来定义 src?
您在摘要周期之前做得太早了,摘要周期处理 ng-src
并添加 src 属性。所以让摘要循环发生,你可以通过将它放在 $timeout
或使用 setTimeout
.
来确保它
.directive('img', function () {
return {
restrict: 'E',
link: function (scope, elem, attrs) {
if ( typeof Modernizr !== 'undefined' && !Modernizr.svg ) {
$timeout(function(){
elem.attr('src', attrs.src.replace('.svg', '.png'));
}, false);
}
}
};
});
或者更好的选择是在 ngSrc
有机会处理它之前过早地进行替换。使用编译函数替换 ng-src 属性值中的扩展名,这也防止了加载图像,就像在前一种情况下发生的那样(一个带有 .svg,一个带有 .png)。
.directive('img', function () {
return {
restrict: 'E',
compile: function (elem, attrs) {
if ( typeof Modernizr !== 'undefined' && !Modernizr.svg ) {
attrs.$set('ngSrc', attrs.ngSrc.replace('.svg', '.png'));
}
}
};
});
我有以下 HTML(在 gsp 内):
<img ng-src="${resource(dir: '')}/images/stores/closeBTN.svg" />
我想使用 Modernizr 检测是否支持 SVG,如果不支持则将图像切换为 png。我已经修改了这个指令:https://github.com/tinacious/angular-svg-png
angular.module('svgPng', [])
.directive('img', function () {
return {
restrict: 'E',
link: function (scope, elem, attrs) {
if ( typeof Modernizr !== 'undefined' && !Modernizr.svg ) {
elem.attr('src', attrs.src.replace('.svg', '.png'));
}
}
};
});
问题是 attrs.src 未定义,因此替换不起作用。我知道 ng-src 应该填充 src,所以我是否需要强制摘要循环或其他东西来定义 src?
您在摘要周期之前做得太早了,摘要周期处理 ng-src
并添加 src 属性。所以让摘要循环发生,你可以通过将它放在 $timeout
或使用 setTimeout
.
.directive('img', function () {
return {
restrict: 'E',
link: function (scope, elem, attrs) {
if ( typeof Modernizr !== 'undefined' && !Modernizr.svg ) {
$timeout(function(){
elem.attr('src', attrs.src.replace('.svg', '.png'));
}, false);
}
}
};
});
或者更好的选择是在 ngSrc
有机会处理它之前过早地进行替换。使用编译函数替换 ng-src 属性值中的扩展名,这也防止了加载图像,就像在前一种情况下发生的那样(一个带有 .svg,一个带有 .png)。
.directive('img', function () {
return {
restrict: 'E',
compile: function (elem, attrs) {
if ( typeof Modernizr !== 'undefined' && !Modernizr.svg ) {
attrs.$set('ngSrc', attrs.ngSrc.replace('.svg', '.png'));
}
}
};
});