Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS异步分配链接href_Javascript_Angularjs_Asynchronous - Fatal编程技术网

Javascript AngularJS异步分配链接href

Javascript AngularJS异步分配链接href,javascript,angularjs,asynchronous,Javascript,Angularjs,Asynchronous,我需要异步更新链接的href。假设我得到了这个html: <a ng-href="{{url}}" ng-click="resolveUrl()" target="_blank">click me</a> 即使是第一次,我也需要这个链接去google.com。如何同步异步调用或如何分配url以便异步函数解析 编辑: 正如@Konstantin Krass指出的,我可以使用window.open()。但是我不能异步使用它,因为浏览器会弹出阻止新窗口。因此,我尝试在点击时

我需要异步更新链接的href。假设我得到了这个html:

<a ng-href="{{url}}" ng-click="resolveUrl()" target="_blank">click me</a>
即使是第一次,我也需要这个链接去google.com。如何同步异步调用或如何分配url以便异步函数解析

编辑:

正如@Konstantin Krass指出的,我可以使用window.open()。但是我不能异步使用它,因为浏览器会弹出阻止新窗口。因此,我尝试在点击时打开另一个窗口(未被阻止),然后在承诺得到解决后,我将打开窗口的url更新到google.com。普朗克是。不幸的是,这在iPad上不起作用。在iPad上,页面url不会更新,因为在iPad上,标签无法相互通信。 有什么想法吗?

这就是你想要的:

app.controller('MainCtrl',函数($scope,$q){
$scope.message='创建文件';
$scope.resolveUrl=函数(){
async().then(函数(resolvedUrl){
$scope.message=“下载文件”
$scope.url=resolvedull;
});
}
函数async(){
var defered=$q.defer();
setTimeout(函数(){
不同的。解决('http://www.google.com');
}, 1000)
回报不同的承诺;
}
});
HTML:

如果您希望计算url并在单击后重定向到url,您只需在收到url后使用本机
location.href

app.controller('MainCtrl', function($scope, $q) {     

  $scope.resolveUrl = function() {
    async().then(function(resolvedUrl){
      location.href= resolvedUrl; //this would open the url in the current page.
      // if you want to offer a download or move 
      // into new browser tab you can go like this: 
      // window.open(resolvedUrl);  
    });
  }

  function async() {
    var deffered = $q.defer();

    setTimeout(function() {
      deffered.resolve('http://www.google.com');
    }, 1000)

    return deffered.promise;
  }
});
并从html中删除
{{url}}

<a ng-click="resolveUrl()">click me</a>
点击我

您想在单击时生成url吗?您的plunker工作正常。它会在单击后1秒解析。因此,如果您想第一次访问google,然后解析另一个url,只需将$scope.url=www.google.com和异步函数更改为新的@是的。问题是,我需要进行一些计算(生成blob pdf),然后将blob url分配给链接,以便用户可以在新选项卡中下载。不确定如何使用Angular执行此操作,但可以尝试:
[1]阻止单击,[2]在处理过程中禁用单击,[3]处理链接生成,[4]绑定链接,[5]删除禁用,[6]javascript trigger click()事件。
可以尝试将其设置为一个按钮,并将其设置为链接,以简化禁用。我需要href即使在第一次单击时也指向google.com。你的解决方案只有在我点击链接两次时才有效。那么,如果用户在你的文件准备好之前点击链接,会发生什么呢?我需要浏览器等待它准备好,然后转到准备好的URL。我只是不知道如何等待承诺的解决。实际上,我不能使用window.open(),因为它在某些浏览器中被阻止(iPad上的Safari)。我(或客户…)需要在新选项卡中打开它。我认为这不能像这样实现,因为实际的单击事件和url重定向发生在任何侦听器可以插入新url之前。要在以后重定向或依赖延迟的url,您需要防止第一次重新定位,并使用位置或窗口。如果您提供下载,为什么不使用iframe进行尝试?
app.controller('MainCtrl', function($scope, $q) {     

  $scope.resolveUrl = function() {
    async().then(function(resolvedUrl){
      location.href= resolvedUrl; //this would open the url in the current page.
      // if you want to offer a download or move 
      // into new browser tab you can go like this: 
      // window.open(resolvedUrl);  
    });
  }

  function async() {
    var deffered = $q.defer();

    setTimeout(function() {
      deffered.resolve('http://www.google.com');
    }, 1000)

    return deffered.promise;
  }
});
<a ng-click="resolveUrl()">click me</a>