Примусове перезавантаження ng-src


77

Як я можу змусити angularjs перезавантажити зображення з атрибутом ng-src, коли URL-адреса зображення не змінилася, але зміст змінився?

<div ng-controller='ctrl'>
    <img ng-src="{{urlprofilephoto}}">
</div>

Служба uploadReplace, яка виконує завантаження файлу, замінює вміст зображення, але не URL-адресу.

app.factory('R4aFact', ['$http', '$q', '$route', '$window', '$rootScope',
function($http, $q, $route, $window, $rootScope) {
    return {
        uploadReplace: function(imgfile, profileid) {
            var xhr = new XMLHttpRequest(),
                fd = new FormData(),
                d = $q.defer();
            fd.append('profileid', profileid);
            fd.append('filedata', imgfile);
            xhr.onload = function(ev) {
                var data = JSON.parse(this.responseText);
                $rootScope.$apply(function(){
                    if (data.status == 'OK') {
                        d.resolve(data);
                    } else {
                        d.reject(data);
                    }
                });
            }
            xhr.open('post', '/profile/replacePhoto', true)
            xhr.send(fd)
            return d.promise;
        }
    }
}]);

Коли uploadReplace повертається, я не знаю, як я можу змусити зображення перезавантажитись

app.controller('ctrl', ['$scope', 'R4aFact', function($scope, R4aFact){
    $scope.clickReplace = function() {
        R4aFact.uploadReplace($scope.imgfile, $scope.pid).then(function(){
            // ??  here I need to force to reload the imgsrc 
        })
    }
}])

Встановіть urlprofilephotoпорожнім, а потім знову встановіть його на url.
Chandermani

Може бути з $scope.$apply?
Іван Черних

Зробивши URL-адресу порожньою, а потім встановивши її заново, надсилає на сервер помилковий запит, якого слід уникати. Область $. $ Apply - це не проблема. Ансер заводської функції вже є в $ rootScope. $ Apply
Рубен Декроп

Відповіді:


77

Легким обхідним шляхом є додавання унікальної позначки часу до ng-src, щоб змусити перезавантажити зображення наступним чином:

$scope.$apply(function () {
    $scope.imageUrl = $scope.imageUrl + '?' + new Date().getTime();
});

або

angular.module('ngSrcDemo', [])
    .controller('AppCtrl', ['$scope', function ($scope) {
    $scope.app = {
        imageUrl: "http://example.com/img.png"
    };
    var random = (new Date()).toString();
    $scope.imageSource = $scope.app.imageUrl + "?cb=" + random;
}]);

1
$ scope.imageUrl + = '?' + Date.now ();
хейчез

28

Можливо, це може бути так просто, як додавання рядка запиту декашу до URL-адреси зображення? тобто

var imageUrl = 'http://i.imgur.com/SVFyXFX.jpg';
$scope.decachedImageUrl = imageUrl + '?decache=' + Math.random();

Це повинно змусити його перезавантажити.


16

"Кутовий підхід" може бути створенням власного фільтра для додавання випадкового параметра запиту до URL-адреси зображення.

Щось на зразок цього:

.filter("randomSrc", function () {
    return function (input) {
        if (input) {
            var sep = input.indexOf("?") != -1 ? "&" : "?";
            return input + sep + "r=" + Math.round(Math.random() * 999999);
        }
    }
})

Тоді ви можете використовувати його так:

<img ng-src="{{yourImageUrl | randomSrc}}" />


6

Спробуйте це

app.controller('ctrl', ['$scope', 'R4aFact', function($scope, R4aFact){
$scope.clickReplace = function() {
    R4aFact.uploadReplace($scope.imgfile, $scope.pid).then(function(response){
        $scope.urlprofilephoto  = response + "?" + new Date().getTime(); //here response is ur image name with path.
    });
}
 }])

0

Я вдався до вказівки розміщувати випадкові параметри в src, але лише в тому випадку, якщо зображення змінюється, тому я не дуже возився з кешуванням.

Я використовую його для оновлення зображення профілю користувача на панелі навігації, коли вони оновлюють його за допомогою AJAX, що трапляється не так часто.

(function() {
  "use strict";

  angular
    .module("exampleApp", [])
    .directive("eaImgSrc", directiveConstructor);

  function directiveConstructor() {
    return { link: link };

    function link(scope, element, attrs) {
      scope.$watch(attrs.eaImgSrc, function(currentSrc, oldSrc) {
        if (currentSrc) {
          // check currentSrc is not a data url,
          // since you can't append a param to that
          if (oldSrc && !currentSrc.match(/^data/)) {
            setSrc(currentSrc + "?=" + new Date().getTime());
          } else {
            setSrc(currentSrc);
          }
        } else {
          setSrc(null);
        }
      })

      function setSrc(src) { element[0].src = src; }
    }
  }
})();
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="exampleApp">
  <div>
    <img ea-img-src="src"></img>
  </div>

  <button ng-click="src = 'http://placehold.it/100x100/FF0000'">IMG 1</button>
  <button ng-click="src = 'http://placehold.it/100x100/0000FF'">IMG 2</button>
  <button ng-click="src = 'http://placehold.it/100x100/00FF00'">IMG 3</button>
</div>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.