【问题标题】:AngularJs - Getting value of ng-src attribute in controller functionAngularJs - 在控制器函数中获取 ng-src 属性的值
【发布时间】:2017-11-07 07:26:19
【问题描述】:

我正在开发 AngularJs 应用程序中的浏览和上传图像功能。我正在使用 ng-image-compress 来压缩图像。每当用户从浏览文件对话框中选择图像时,我都需要在我的控制器中访问 ng-src 属性的值。

<input id="File1" type="file" accept="image/*" image="image1" ng-image-compress ng-model="image2" 
        resize-max-height="800" resize-max-width="800" resize-quality="0.7" resize-type="image/jpg" 
        onchange="angular.element(this).scope().uploadPhoto()" />
<br /><br />
<img ng-src="{{image1.compressed.dataURL}}" class="thumb" />

使用上面的代码,当我选择图像时,调用 uploadPhoto() 方法并在 img 标签中正确显示所选图像,但我想在 uploadPhoto() 方法中访问 ng-src 值或 {{image1.compressed.dataURL}}。

注意:

 <button ng-click="uploadPicture(image1.compressed.dataURL)">Submit</button>

如果我尝试这个,我在 uploadPicture() 中得到了压缩的 dataUrl,但我不想要这种类型的处理。请提出适当的方法。

【问题讨论】:

    标签: javascript angularjs image ng-image-compress


    【解决方案1】:

    当你使用普通的 JS onchange 事件时,你已经超出了控制器的作用域,这就是为什么你必须调用 angular.element(this).scope() 才能回到作用域并执行 uploadPhoto() 方法。

    尝试使用 Angular JS 的ng-change 方法:

    <input id="File1" 
           type="file" 
           accept="image/*" 
           image="image1" 
           ng-image-compress 
           ng-model="image2" 
           resize-max-height="800" 
           resize-max-width="800" 
           resize-quality="0.7" 
           resize-type="image/jpg" 
           ng-change="uploadPhoto()" />
    <br /><br />
    <img ng-src="{{image1.compressed.dataURL}}" class="thumb" />
    

    现在您应该可以在您的控制器或服务中访问$scope.image1.compressed.dataURL

    如果您必须使用 'scope()' 函数继续使用 JS 解决方案,请尝试将所需信息作为参数传递给 uploadPhoto() 函数(如果可能)。比如:

    onchange="angular.element(this).scope().uploadPhoto(angular.element(this).scope().image1.compressed.dataURL)"
    

    或使用jQuery:

    onchange="angular.element(this).scope().uploadPhoto(angular.element(this).next('img').attr('src'))"
    

    更新

    这是使用$scope.$watch的解决方案:

    $scope.$watch('image1.compressed.dataURL', function(nVal) {
      if (nVal) {
        console.log('image1.compressed.dataURL', nVal);
      }
    });
    

    这里是一个笨蛋:https://plnkr.co/edit/ArdhF6rPtREMCAzt7Eec?p=preview

    在 plunker 中我填充了另一个范围变量并在 HTML 上使用它

    【讨论】:

    • 感谢您的回复。我已经尝试了这两个建议。 ng-change 不会在输入类型 = 文件的情况下触发,这就是我使用纯 JS onchange() 事件的原因。 onchange="angular.element(this).scope().uploadPhoto(angular.‌​element(this).scope(‌​).image1.compressed.‌​dataURL)" 导致 Uncaught TypeError “Cannot read property 'compressed' of undefined” 如果我只使用 onchange="angular.element(this).scope().uploadPhoto(angular.‌​element(this).scope(‌​).image1)",那么我得到了 image1 的未定义值。我不明白我错过了什么?
    • 您是否尝试通过angular.element(this).next('img').attr('src')
    • 嗨,Andriy,我尝试了这个以及几种可能的方法。 angular.element(this).next('img').attr('src')angular.element(this).next('img').attr('ng-src') 在控制器中给了我未定义的值。使用angular.element('img') 为我提供了不包括 src 值的 img 标签详细信息,如 ​。有没有办法将 ng-src 附加到 ng-model 或范围变量并在控制器中访问该变量。
    • 我看到你有 `ng-model=​"imgCompressUrl"`,你是否也尝试访问 angular.element(this).scope().imgCompressUrl?
    • 我更新了我的答案并添加了 plunker (plnkr.co/edit/ArdhF6rPtREMCAzt7Eec?p=preview) 我在 image1.compressed.dataURL 上使用 $scope.$watch 的地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2014-04-16
    • 2013-11-27
    相关资源
    最近更新 更多