空ng-src不会更新图像

gab*_*gab 46 angularjs

我正在使用ng-src指令,以避免浏览器在Angular评估表达式之前请求图像.

ng-src={{image}}如果表达式"image"发生变化,将更新图像的src属性.我误解了为什么如果表达式("myImage.png")变空(""),ng-src指令不会更新图像的路径.

当表达式变空时,ng-src属性变为空,但src属性仍然是最后一个已知的src.所以它不会更新图像.为什么src属性没有更新(到空src),以便图像"消失".

这是一个掠夺者

谢谢

dev*_*ing 40

MadScone的建议是一个很酷的主意,但它并不适用于所有浏览器.我最后只在src不为空时才显示元素:

<img ng-show="theImage!==''" ng-src="{{theImage}}">
Run Code Online (Sandbox Code Playgroud)

在阅读了MadScone引用的帖子(这里)之后,这对我来说似乎是最安全的选择.正如许多人在那里指出的那样,接受的答案并不适用于所有浏览器,并且可能会出现一些其他问题.简单地隐藏元素就可以避免这一切.

更新: 正如评论中指出的那样,!==''ng-show完全没必要.这是更清洁的版本:

<img ng-show="theImage" ng-src="{{theImage}}">
Run Code Online (Sandbox Code Playgroud)

  • <img rel="nofollow noreferrer" ng-show ="theImage"ng-src ="{{theImage}}">对我来说这已经成功了,因为ng-show评估为bool而空字符串AND null将变为false. (6认同)

小智 39

对此的答案在Angular代码中.这不是一个错误,只是他们认为他们想要的行为.从第13895行开始,您可以看到此指令代码:

forEach(['src', 'srcset', 'href'], function(attrName) {
   var normalized = directiveNormalize('ng-' + attrName);
   ngAttributeAliasDirectives[normalized] = function() {
   return {
      priority: 99, // it needs to run after the attributes are interpolated
      link: function(scope, element, attr) {
          attr.$observe(normalized, function(value) {

         if (!value)
             return;

         attr.$set(attrName, value);

         if (msie) element.prop(attrName, attr[attrName]);
       });
     }
    };
  };
});
Run Code Online (Sandbox Code Playgroud)

关键在于:

if (!value) return;

如您所见,如果将ng-src表达式更改为空字符串,则永远不会更改实际的src值.你可以绕过这个做MadScone建议的事情.

  • 问题是,他们为什么选择这种行为。它使图像元素处于不一致状态。当模型为空时显示图像。 (3认同)

Mad*_*one 26

更新(2015年4月)

看到开发人员的回答,显然我最初建议的这种方法可能不适用于所有浏览器.


原件(2014年2月)

我不完全确定为什么会这样,但无论如何这里有一种解决方法.将此功能添加到您的控制器:

$scope.getImage = function(src) {
  if (src !== "") {
    return src;  
  } else {
   return "//:0"; 
  }
};
Run Code Online (Sandbox Code Playgroud)

"空白"图像将获得一个源//:0不会导致丢失的图像图标出现(请参阅此线程的最佳答案).

然后您可以使用以下方式设置源:

<img ng-src="{{getImage(superImage)}}" />
Run Code Online (Sandbox Code Playgroud)

编辑:

实际上,将按钮点击更改为此更容易:

<button ng-click="superImage = '//:0'">Remove superImage</button>
Run Code Online (Sandbox Code Playgroud)

然后就不需要这个功能了.虽然我认为函数方法更好.

  • 简写:`return src || "//:0";` (2认同)

小智 8

解决它的另一个简短方法: <img ng-src="{{image?image:' '}}" />