AngularJS - update URL in href inainte de a redirectiona utilizatorul

Salutare,

Ma confrunt cu o problema de front-end in AngularJS.

Experienta mea fiind limitata in acest domeniu, as vrea sa fac o implementare cat mai corecta.

Asadar, avem urmatorul HTML in template:
<a target="_blank" ng-href="{{myProperty.href}}" ng-click="myMethod($event)">Click me!</a>

Initial, myProperty.href are o valoare implicita. Cand utilizatorul face click, prin apelarea myMethod() se fac anumite procesari si request-uri asincrone, care in final vor popula cu o valoare noua myProperty.href.

Si acum problema: deoarece in myMethod() lucrurile se intampla asincron, cand utilizatorul da click pe link este directionat la adresa implicita. E adevarat ca la 1-2 secunde dupa click, in href apare noua adresa.

Cum pot face in asa fel incat evenimentul de click sa fie “disponibil” de-abia dupa ce s-a facut procesarea in myMethod()?

O varianta ar fi sa renunt la ng-href si sa folosesc $window.open, dar chiar si asa ar insemna sa folosesc $timeout pentru “a astepta” dupa request-urile respective (pentru ca metodele care sunt responsabile de procesare in interiorul myMethod nu returneaza un promise), fapt ce ar putea determina browser-ul sa blocheze deschiderea link-ului in tab nou.

ștergi href-ul si faci $location.path('myProperty.href') cand ajax-ul s-a terminat

Din cate stiu $location.path() nu-mi permite sa deschid URL-ul intr-un tab nou.

daca vrei sa deschizi in tab nou ar fi mai usor sa adaugi un link ascuns si sa faci trigger pe ala cand ajax-ul s-a terminat

la 1-2 secunde dupa click, in href apare noua adresa.

onclick=“return false” e primul rezultat de pe google, faci return false până când nu ai return de la .then.
sau a{ text-decoration: none; cursor: default; } până când nu primești răspuns.

$event.preventDefault()?

de ce ai avea nevoie de un astfel de comportament? numa’ intreb

Guys, multumesc pentru raspunsuri, dar asa cum spuneam in postarea initiala, nu stiu cand se termina request-urile din myMethod(). Fac parte dintr-un serviciu third-party in care nu pot face modificari, nu returneaza un promise, ci pur si simplu seteaza niste variabile in interiorul serviciului.

Pui un if. Dacă href nu e corect, faci event.preventDefaul(), dacă da, continue.

Am gasit eu cum se face.
Deschizi un nou tab cu $window.open, pastrezi o referinta la acel nou tab. Urmaresti variabila myProperty.href si cand se schimba redirectionezi acel nou tab catre noul url.

Am facut un demo si functioneaza:

4 Likes

E buna propunerea, trebuie sa vad cum conving clientul de acel loading screen :slight_smile: Multumesc.

Cu placere. Poate sa fie o pagina alba (un html gol), nu conteaza.
Ideea e sa se deschida noul tab atunci cand dai click.