【问题标题】:How I can use $getDownloadURL() promise with ng-repeat Angularjs 1.6我如何在 ng-repeat Angularjs 1.6 中使用 $getDownloadURL() 承诺
【发布时间】:2017-11-25 22:18:36
【问题描述】:

我正在构建一个 SPA,我正在使用 Angularjs 1.6 和 firebase(数据库和存储)。

我想在我的 html 页面上使用来自 firebase 存储的图像。
为了实现这一点 我正在使用一个指令,它在某些页面上运行良好,但如果我使用 ng-repeat 循环并动态粘贴链接到保存在 一个firebase存储,我偶然发现了一个问题。

我正在使用$getDownloadURL() 获得待处理的承诺,一段时间后它解决了,但页面已经加载并且我遇到了崩溃。

我可以更改$getDownloadURL()的承诺吗?

我的代码:

angular.module('module', ['firebase']).controller('someCtrl', someCtrl).directive('firebaseSrc', FirebaseStorageDirective);

function FirebaseStorageDirective($firebaseStorage, firebase) {
    return {
      restrict: 'A',
      priority: 99,
      link: function (scope, element, attrs) {
        attrs.$observe('firebaseSrc', function (newFirebaseSrcVal) {
          if (newFirebaseSrcVal !== '') {
            var storageRef = firebase.storage().ref(newFirebaseSrcVal);
            var storage = $firebaseStorage(storageRef);
            storage.$getDownloadURL().then(function  getDownloadURL(url) {
              element[0].src = url;
            });
          }
        });
      }
    };
  }
FirebaseStorageDirective.$inject = ['$firebaseStorage', 'firebase'];
<ul>
<li ng-repeat="item in items">
<img firebase-src="{{item.somePath}}" />
</li>
</ul>

【问题讨论】:

  • 我没有使用指令,但问题完全一样。你得到结果了吗?

标签: angularjs firebase angularjs-ng-repeat firebase-storage


【解决方案1】:

使用attrs.$observe时,指令属性需要使用{{ }}插值来评估Angular Expressions:

link: function (scope, element, attrs) {
    attrs.$observe('firebaseSrc', function (newFirebaseSrcVal) {
<ul>
<li ng-repeat="item in items">
<img firebase-src="{{item.somePath}}" />
</li>
</ul>

或使用scope.$watch 直接评估角度表达式:

link: function (scope, element, attrs) {
    scope.$watch(attrs.firebaseSrc, function (newFirebaseSrcVal) {
<ul>
<li ng-repeat="item in items">
<img firebase-src="item.somePath" />
</li>
</ul>

【讨论】:

  • 不幸的是,它对我不起作用,如果我更改为 $scope.$watch 我会捕获“ReferenceError: $scope is not defined”,但如果我添加到我的代码“scope: true”我发现错误“错误:[$compile:multidir]”
  • 使用scope.$watchscope 没有 $ 美元符号。
  • 谢谢!我解决了这个问题并重写了指令,我在下面添加的代码可能会对某人有所帮助,干杯
【解决方案2】:

我有我的 firebaseDB,我得到了 json 文件,其中 item.path(进入 html)是图片的路径,而 item.picture[0] 是文件夹路径中数组图片中图片的名字

我的新模块

MODULE:
angular.module('myModule', ['firebase']).directive('firebaseImage', FirebaseImageDirective);

DIRECTIVE:
function FirebaseImageDirective($firebaseStorage, firebase) {
    return {
      restrict: 'E',
      priority: 99,
      scope: {},
      link: function (scope, elem, attrs) {
            scope.descr = attrs['fireImageAlt'];
            var myRef = attrs['fireImagePath'];
            var storageRef = firebase.storage().ref(myRef);
            var storage = $firebaseStorage(storageRef);
            storage.$getDownloadURL().then(function getDownloadURL(url) {
              scope.path = url;
        });
      },
      template: "<img src='{{path}}' alt='{{descr}}'/>",
      replace: true
    };
  }
FirebaseImageDirective.$inject = ['$firebaseStorage', 'firebase'];
<ul>
  <li ng-repeat="item in data">
    <firebase-image fire-image-path="{{item.path+'/'+ item.picture[0]}}"
                    fire-image-alt="{{item.species + ' ' + item.name}}">
    </firebase-image>
  </li>
</ul>

【讨论】:

  • 函数 uploadImage(fileData, storagePath) { var defer = $q.defer(); var metadata = { contentType: 'image/jpeg,image/png', }; var storageRef = firebase.storage().ref(); var uploadTask = storageRef.child(storagePath + '/' + fileData.files[0].name).put(fileData.files[0], metadata); var tangRef = storageRef.child(storagePath + '/' + fileData.files[0].name); var urlData = tangRef .getDownloadURL() .then(function(url) { defer.resolve(url); return defer.promise; }) .catch(function(error) { return defer.promise; });返回网址数据; }
猜你喜欢
  • 2015-12-22
  • 2015-12-22
  • 2012-10-10
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 2012-08-12
  • 2017-01-26
  • 1970-01-01
相关资源
最近更新 更多