如何在AngularJS ng-repeat中呈现包含`new Image()`的变量?

时间:2016-01-14 21:53:34

标签: javascript angularjs

我有一个如下所示的数组:

var imageList = [ image1, image2, image3 ];

此数组中的每个元素都是包含new Image()的变量。 例如:var image1 = new Image()

在设置其网址后,我使用.onload事件为每个元素预加载每个图像。只有在加载了所有图像之后,才会发生其他任何事情。

如何在AngularJS中输出每个数组元素并显示图像?

<li ng-repeat="image in imageList">
   {{ image }}
   /* I want the expected output of the above line to look like
      <img src="./img/xx.svg" /> */
</li>

我不想做下面的代码,因为我已经将数组中的每个元素创建为新的Image():

<li ng-repeat="image in someImageList">
   <img ng-src="{{ image.url }}" />
</li>

如果我{{ image }},则当前输出只是{}的列表。如果仅使用image,则输出是&#34;图像&#34;的列表。字符串。

我使用JavaScript而不是使用<img/>标记创建新图像元素的原因是1.我需要预加载图像和2.我需要在{{1}中绘制这些图像}}。为相同的图像源创建<canvas>是多余的。此外,它打开了一个模态,显示这些图像的列表打开速度很慢。因此,如果图像已预先加载,则模式可能打开得更快。

1 个答案:

答案 0 :(得分:2)

您需要将图像转换为数据uri并保存该字符串。

$scope.images = [];

loadImage('./img/xx.svg');

function loadImage(src) {
  var img = new Image();

  img.onload = function() {
    // Create a canvas
    var canvas = document.createElement('canvas');

    // Be sure the canvas is the same size as your image
    canvas.width = this.width;
    canvas.height = this.height;

    // Draw the image to the canvas
    canvas.getContext('2d').drawImage(this, 0, 0);

    // Add the data uri to your scope
    $scope.images.push(canvas.toDataURL('image/png'));

    // "Notify" Angular something has changed
    $scope.$apply();
  }

  img.src = src;
}

然后你可以像这样打印 -

<li ng-repeat="image in images">
   <img ng-src="{{ image }}" />
</li>

图像将是数据uri(不是网址)。

如何使用画布实现此功能取决于您。