2014-06-27 3 views
3

Мне нужно обновить href ссылки асинхронно. Скажем, у меня есть этот HTML:Угловое асинхронное определение href по ссылке

<a ng-href="{{url}}" ng-click="resolveUrl()" target="_blank">click me</a> 

И этот угловой регулятор:

app.controller('MainCtrl', function($scope, $q) { 
    $scope.url = '#'; 

    $scope.resolveUrl = function() { 
    async().then(function(resolvedUrl){ 
     $scope.url = resolvedUrl; 
    }); 
    } 

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

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

    return deffered.promise; 
    } 
}); 

И мне нужна ссылка, чтобы перейти к google.com даже в первый раз. Как синхронизировать асинхронный вызов или как назначить URL-адрес, чтобы асинхронная функция была решена?

Code in plunker

Отредактировано:

Как @Konstantin Красс отметил, я мог бы использовать метод window.open(). Но я не могу использовать его асинхронно, потому что всплывающие окна браузера будут блокировать новое окно. Поэтому я попытался открыть другое окно на клике (которое не заблокировано), а затем после того, как обещание будет разрешено, я обновляю URL-адрес открытого окна на google.com. Отредактированный plunker - here. К сожалению, это не работает на iPad. На iPad URL страницы не обновляется, потому что на iPad вкладки не могут общаться друг с другом. Любые идеи?

+0

, так что вы хотите сгенерировать URL-адрес? –

+0

Ваш плункер работает правильно. Он разрешает одну секунду после нажатия. Поэтому, если вы хотите перейти в Google в первый раз, а затем разрешить другой URL-адрес, просто измените $ scope.url = www.google.com и асинхронную функцию на новую. http://plnkr.co/edit/SSnKwHKpoWCqbhISm2iq?p=preview –

+0

@KonstantinKrass да. Проблема в том, что мне нужно обрабатывать некоторые вычисления (генерируя blob pdf), а затем назначая URL-адрес blob на ссылку , чтобы пользователь мог загрузить ее на новой вкладке. – daerin

ответ

0

Это то, что вы хотите: here

app.controller('MainCtrl', function($scope, $q) { 
    $scope.message = 'Create File'; 

    $scope.resolveUrl = function() { 
    async().then(function(resolvedUrl){ 
     $scope.message = "Download File" 
     $scope.url = resolvedUrl; 
    }); 
    } 

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

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

    return deffered.promise; 
    } 
}); 
HTML: 

    <body ng-controller="MainCtrl"> 
    <a ng-href="{{url}}" ng-click="resolveUrl()" target="_blank">{{message}}</a> 
    </body> 
+0

Мне нужно, чтобы href указывал на google.com даже при первом нажатии. Ваше решение работает только в том случае, если я дважды нажимаю ссылку. – daerin

+0

Итак, что должно произойти, если пользователь нажимает ссылку до того, как ваш файл будет готов? – sylwester

+0

Мне нужно, чтобы браузер подождал, пока он будет готов, а затем перейдите к подготовленному URL. Я просто не могу понять, как ждать решения обещания. – daerin

1

Если вы хотите, чтобы вычислить URL и перенаправления на URL после щелчка, вы могли бы просто использовать родной location.href после получения URL.

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; 
    } 
}); 

И удалить {{url}} из HTML.

<a ng-click="resolveUrl()">click me</a> 
+0

На самом деле я не могу использовать window.open(), поскольку он заблокирован в некоторых браузерах (Safari на iPad). И мне (или клиенту ...) нужно открыть его на новой вкладке. – daerin

+0

Я думаю, что этого не может быть достигнуто так, потому что фактическое событие клика и перенаправление к URL-адресу происходит до того, как любой слушатель может ввести новый URL-адрес. Чтобы перенаправить впоследствии или зависеть от задержанного URL-адреса, вам необходимо предотвратить первое перемещение и использовать местоположение или окно. Если вы предлагаете загрузить, почему бы не попробовать его с iframe? –

Смежные вопросы