如何使用angularjs触发ng-click中另一个元素的click事件?

cho*_*ovy 43 angularjs

我正在尝试触发<input type="file">元素的click事件button.

<input id="upload"
    type="file"
    ng-file-select="onFileSelect($files)"
    style="display: none;">

<button type="button"
    ng-click="angular.element('#upload').trigger('click');">Upload</button>
Run Code Online (Sandbox Code Playgroud)

通常的做法是隐藏已知的uglified beast <input type=file>并通过其他方式触发它的click事件.

J S*_*off 35

如果您的输入和按钮是兄弟姐妹(并且它们在您的情况下是OP):

<input id="upload"
    type="file"
    ng-file-select="onFileSelect($files)"
    style="display: none;">

<button type="button" uploadfile>Upload</button>
Run Code Online (Sandbox Code Playgroud)

使用指令将按钮的单击绑定到文件输入,如下所示:

app.directive('uploadfile', function () {
    return {
      restrict: 'A',
      link: function(scope, element) {

        element.bind('click', function(e) {
            angular.element(e.target).siblings('#upload').trigger('click');
        });
      }
    };
});
Run Code Online (Sandbox Code Playgroud)

  • 伟大的指令 - 如果你在范围参数`scope:{siblingId:'='}中传递sibling id,它会变得更加可重用.使用指令如`<button uploadfile sibling-id ="upload"> Upload < /按钮>` (3认同)

cho*_*ovy 14

所以这是一个简单的修复.只需将其移动ng-click到范围单击处理程序:

<input id="upload"
    type="file"
    ng-file-select="onFileSelect($files)"
    style="display: none;">

<button type="button"
    ng-click="clickUpload()">Upload</button>



$scope.clickUpload = function(){
    angular.element('#upload').trigger('click');
};
Run Code Online (Sandbox Code Playgroud)

  • Angular包括jquery lite.如果你放入jquery,它会使用它.我认为使用预期的东西并没有错. (2认同)
  • @chovy jqLit​​e既没有click()也没有get(). (2认同)

小智 6

我有同样的问题,这个小提琴是shizzle :)它使用一个指令来正确设置文件字段的样式,你甚至可以使它成为一个图像或其他什么.

http://jsfiddle.net/stereosteve/v5Rdc/7/

/*globals angular:true*/
var buttonApp = angular.module('buttonApp', [])

buttonApp.directive('fileButton', function() {
  return {
    link: function(scope, element, attributes) {

      var el = angular.element(element)
      var button = el.children()[0]

      el.css({
        position: 'relative',
        overflow: 'hidden',
        width: button.offsetWidth,
        height: button.offsetHeight
      })

      var fileInput = angular.element('<input type="file" multiple />')
      fileInput.css({
        position: 'absolute',
        top: 0,
        left: 0,
        'z-index': '2',
        width: '100%',
        height: '100%',
        opacity: '0',
        cursor: 'pointer'
      })

      el.append(fileInput)


    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<div ng-app="buttonApp">

  <div file-button>
    <button class='btn btn-success btn-large'>Select your awesome file</button>
  </div>

  <div file-button>
    <img src='https://www.google.com/images/srpr/logo3w.png' />
  </div>

</div>
Run Code Online (Sandbox Code Playgroud)