AngularJS从指令内的锚标记上以编程方式触发click事件

时间:2016-10-11 07:42:58

标签: angularjs events click directive programmatically

我已经创建了一个下载音频文件的指令。单击指令标记时,我从服务器获取base64编码数据,并将锚标记的“href”属性(这是指令的模板)设置为获取的数据。然后我尝试以编程方式单击“a”标记,以便可以向用户显示文件下载弹出窗口。这里的问题是,当触发'click'事件时,除了第二次手动点击时,它什么都不做。

我嵌入了fiddle code。任何帮助都非常感谢。 以下是指令代码:

angular.module('myTestApp', [])
  .directive('webDownloader', downloadFn);

downloadFn.$inject = ['$timeout'];
function downloadFn($timeout) {
  function downloadLinkFn(scope, element) {
    scope.fileName = scope.fileName || 'test-file';

scope.populateData = function() {
  if (scope.dataURL) {
  } else {
    scope.webProvider()
      .then(function (response) {
      scope.dataURL = 
        'data:audio/ogg;base64,' + response;

                $timeout(function() {
        angular.element(element).
        find('a').triggerHandler('click');
      }, 0);
    });
  }
};

  // Return the object.
  return {
template: '<a data-ng-href="{{dataURL}}" download="{{fileName}}" data-ng-click="populateData()" data-ng-transclude></a>',
transclude: true,
restrict: 'A',
scope: {
  fileName: '@',
  webProvider: '&'
},
link: downloadLinkFn
  };
}

1 个答案:

答案 0 :(得分:3)

我仍然不确定,但如果我更换 angular.element(element).find('a').triggerHandler('click'); angular.element(element).find('a')[0].click();它有效。

更新: 如果triggerHandler('click')不存在,则href无效。因此,如果我将默认值设置为scope.dataURL = '#',则上述代码将有效。