【问题标题】:empty ng-src doesn't update image空 ng-src 不更新图像
【发布时间】:2014-04-01 07:25:12
【问题描述】:

我使用 ng-src 指令是为了避免浏览器在 Angular 评估表达式之前请求图像。

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

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

这是plunker

谢谢

【问题讨论】:

  • 这取决于您如何设置值。你需要在这里分享一些代码。

标签: angularjs


【解决方案1】:

这个问题的答案在 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]);
       });
     }
    };
  };
});

关键在:

if (!value) return;

如您所见,如果您将 ng-src 表达式更改为空字符串,这将永远不会更改实际的 src 值。你可以做一些 MadScone 建议的事情来解决这个问题。

【讨论】:

  • 问题更多,他们为什么会选择这样的行为。它使图像元素处于不一致的状态。模型为空时显示图像。
  • 嗯,我不确定他们做出这个决定的想法是什么。我的想法是:
  • 嗯,我不确定他们在这个决定背后的想法。我的想法是:根据linksrc 必须是一个 可能被空格包围的非空 URL 才能有效。但更重要的是,正如您可以在此处阅读的 link,空的 src 可能会导致多个问题。也许这就是他们试图阻止的。
  • 好的,感谢您提供这些链接!我对空的 src 了解不多。无论如何,@MadScone 技巧是一个很好的解决方法!在自定义指令(data-custom-src)中添加这个技巧很诱人:)
  • 也可以使用jQuery直接设置图片src。不确定它会对随后的 jQuery 摘要周期产生多大的影响。
【解决方案2】:

MadScone 的建议是一个很酷的想法,但它不适用于所有浏览器。我最终只在 src 不为空时才显示元素:

<img ng-show="theImage!==''" ng-src="{{theImage}}">

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

更新: 正如 enpenax 在 cmets 中指出的那样,ng-show 中的 !=='' 完全没有必要。这是更清洁的版本:

<img ng-show="theImage" ng-src="{{theImage}}">

【讨论】:

  • 对我来说,这已经解决了问题,因为 ng-show 评估为 bool 并且空字符串 AND null 将结果是假的。
  • 我也得出了同样的结论,即使用 ng-show 是解决问题的更好方法。我其实用的是ng-if,但是解法的概念是一样的。
  • 这已经很晚了,但@enpenax 有一个很好的观点。空字符串是虚假的,所以 !== 完全没有必要。我会用这些信息更新。
【解决方案3】:

更新(2015 年 4 月)

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


原件(2014 年 2 月)

我不完全确定为什么会发生这种情况,但无论如何这里有一种解决方法。将此函数添加到您的控制器:

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

“空白”图像将获得//:0 的来源,这不会导致出现丢失的图像图标(请参阅this thread 上的最佳答案)。

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

<img ng-src="{{getImage(superImage)}}" />

编辑:

实际上,将按钮单击更改为这样会更容易:

<button ng-click="superImage = '//:0'">Remove superImage</button>

那么就不需要这个函数了。虽然我觉得函数方法更好。

【讨论】:

  • 速记:return src || "//:0";
  • 这是一个很酷的想法,在某些浏览器中对我有用,但并非在所有浏览器中都适用。主要问题是“//:0”实际上并非在任何地方都有效。我添加了另一个应该全面的答案。
  • @developering 够公平的。我已经为将来可能没有阅读所有答案或可能错过您的评论的任何毫无戒心的人更新了我的答案。
【解决方案4】:

另一种解决方法: &lt;img ng-src="{{image?image:' '}}" /&gt;

【讨论】:

    【解决方案5】:

    通过 set value = " "; 带空格。

    我还添加了以下 css 以确保它不显示。

    img[src="_"]
        display none !important
    

    这里已经讨论过真正的原因:https://github.com/angular/angular.js/issues/1218

    【讨论】:

      【解决方案6】:

      ng-hide 和 ng-show 可以帮你解决

      <img ng-src="{{Image}}" ng-hide="Image == null" ng-show="Image != null" ng-click="ChooseImage()" width="100%"  />
      

      $scope.Image = null;

      <img ng-src="{{Image}}" ng-hide="Image === ''" ng-show="Image !== ''" ng-click="ChooseImage()" width="100%"  />
      

      $scope.Image = '';

      【讨论】:

        【解决方案7】:

        &lt;img data-ng-src="{{image || 'http://www.1x1px.me/FFFFFF-0.png'}}" data-ng-model="image"&gt;

        您可以选择任何适合您网站的 1x1px 图片并替换您自己的http://www.1x1px.me/FFFFFF-0.png。对于我的网站,我使用http://www.1x1px.me 上的可用图片。

        P/S:不用担心img标签的原始src属性,因为它不受图像模型的影响

        【讨论】:

          【解决方案8】:

          清空ng-src 的可能解决方法是here.

          <img ng-src="{{image || '//:0' }}" />
          

          使用//:0的详细解释可以看from this answer.

          总结一下:

          采用当前协议,省略主机名,端口设置为零,无效,应被网络层杀死。

          另外,如果您有一个默认图像源,那么您可以简单地将ng-src 设置为该默认源,而不是清空ng-src,而ng-src 必须为空。

          【讨论】:

            【解决方案9】:
             <img src="{{superImage}}" />   
            

            这按预期工作 编辑:

            其他工作,也许你可以使用空字符串。

            ng-click="superImage = ' '  
            

            使其为空。它不会触发 404

            【讨论】:

            • 使用 src 属性将在 Angular 评估表达式 superImage 之前触发请求,这将导致 404 未找到。
            猜你喜欢
            • 1970-01-01
            • 2013-03-25
            • 1970-01-01
            • 1970-01-01
            • 2013-10-08
            • 1970-01-01
            • 1970-01-01
            • 2014-11-08
            • 1970-01-01
            相关资源
            最近更新 更多