Понимание AngularJS ng-src

как пояснил здесь, директива angularjs ng-src используется для предотвращения загрузки браузером ресурса (например, изображения) до того, как руль будет проанализирован. В настоящее время я использую следующий код:

<div ng-controller="MyCtrl">
  <img ng-src="http://localhost:8081/media/{{ path }}" />
</div>

со следующим JS:

function MyCtrl($scope, $timeout) {
    $timeout(function () {
        $scope.path = 'images/23694c70-04d7-11e3-9ba8-73fb00de24c4.png';
    }, 1000);
};

путь извлекается из веб-службы. Из-за этой задержки, браузер пытается загрузить http://localhost:8081/media/, что вызывает 404. Как только путь будет получен, браузер выдаст правильный запрос и загружает изображение.

каков предпочтительный метод предотвращения загрузки любых ресурсов, пока все данные не будут готовы?

см. jsfiddle для примера мою ситуацию.

спасибо,

Martijn

6 ответов


поместите весь путь внутри переменной $scope. Что путь ng-src будет ждать, пока вы не предоставите ему полностью разрешенный путь к изображению:

<div ng-controller="MyCtrl">
  <img ng-src="{{ path }}" />
</div>
function MyCtrl($scope, $timeout) {
    var path = 'https://si0.twimg.com/profile_images/';
    $timeout(function () {
        $scope.path = path + '2149314222/square.png';
    }, 1000);
};

скрипка


информация к примеру


давайте blogitem directive. В приведенных выше примерах уже показано, как установить значение по умолчанию.


HTML:

<blogitem ng-repeat="item in items" 
          bg-src="{{ item.image }}" 
          caption="{{ item.title }}"/>

JS:

.directive( 'blogitem', function()
{
    return {
        restrict    : 'E',
        templateUrl : 'js/app/directives/blogitem.html',
        replace     : true,
        // pass these two names from attrs into the template scope
        scope       : {
            intro : '@',
            bgSrc : '@'
        }
    }
} )

шаблон HTML :

<article>
    <img ng-src="{{ bgSrc }}"/>
    <p>{{ intro }}</p>
</article>

надеюсь, это поможет вам понять ng-src.


Я тоже попал в ту же проблему. Я заметил, что если значение для ng-src не определено, то img не извлекается. Поэтому я создал метод утилиты для объединения двух аргументов и возврата значения тогда и только тогда, когда оба аргумента определены. Увидеть ниже.

<div ng-controller="MyCtrl">
  <img ng-src="{{MyUtil.strConcat('http://localhost:8081/media/', path)}}" />
</div>
myApp.factory('MyUtil', function() {
    return {
        strConcat: function(str1, str2) {
            return (angular.isDefined(str1) && angular.isDefined(str2)) ? 
                (str1 + str2) : undefined;
        }
    }
});

function MyCtrl($scope, $timeout, MyUtil) {
    $scope.MyUtil = MyUtil;
...
}

скрипка


вы можете установить ng-src в пустую строку, если данные еще не заполнены:

<div ng-controller="MyCtrl">
  <img data-ng-src="{{ path && 'http://localhost:8081/media/'+path || '' }}" />
</div>

, когда path неинициализирован, условие будет короткое замыкание и перейти к or часть и установить data-ng-src до '' (пустая строка), таким образом не попав на сервер.


в последней версии вы можете оценить его следующим образом:

ng-src="{{ methodThatReturnsString() }}"

Я уверен, что 100% работы

сначала вы должны сделать свой запрос такой

select (select '../Images/'|| T_LANG2_NAME ||'.png' T_LANG2_NAME from T04222_T where T_LOG_ID = T04220.T_C_STATUS) TIMER from T04220 
where T_PAT_NO = '89004331' group by T_C_STATUS 
having max(T_ARRIVAL_DATE) = (select max(T_ARRIVAL_DATE) from T04220 where T_PAT_NO = '89004331');) then you write Code for Controller like this ( if (scope.T_PAT_NO) {
                debugger;
                $http({
                        method: 'POST',
                        url: '/T04205/GetTimerImage',
                        data: JSON.stringify({ PatientCode: scope.T_PAT_NO })
                    }).
                    success(function (data) {
                        debugger;
                        var newDataJSON = JSON.parse(data);

                        scope.TIMER = newDataJSON[0].TIMER;

                    });

затем html-код, как это

<input id="imTimer" type="image" src="{{TIMER}}" style="width: 80px;height: 80px" />