2014-06-27 72 views
3

我需要異步更新鏈接的href。比方說,我有這個網站:角度異步分揀到鏈接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()。但我不能異步使用它,因爲瀏覽器會彈出阻止新窗口。所以我試圖打開另一個窗口點擊(未被阻止),然後在諾言解決後,我將打開的窗口的網址更新爲google.com。編輯過的plunker是here。不幸的是,這不適用於iPad。在iPad上,頁面URL不會更新,因爲在iPad上,標籤無法相互通信。 有什麼建議嗎?

+0

所以你想要點擊產生的網址? –

+0

你的運動員工作正常。點擊後它會解決一秒鐘。所以如果你想第一次去谷歌,然後解決另一個網址,只需將$ scope.url = www.google.com和異步功能更改爲新的。 http://plnkr.co/edit/SSnKwHKpoWCqbhISm2iq?p=preview –

+0

@KonstantinKrass是的。問題是我需要處理一些計算(生成blob pdf),然後將blob url分配給鏈接,以便用戶可以在新選項卡中下載它。 – 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,你可以只使用本地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; 
    } 
}); 

並從html中刪除{{url}}

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

其實我無法使用window.open(),因爲它在某些瀏覽器(iPad上的Safari)中被阻止。我(或客戶)需要它在新標籤中打開。 – daerin

+0

我認爲這不能像這樣實現,因爲實際的點擊事件和重定向到的URL發生在任何監聽器可以注入新的url之前。要後續重定向或取決於延遲的url,您需要防止第一次重定位並使用位置或窗口 如果您提供下載,爲何不嘗試使用iframe? –