2015-10-20 14 views
7

Robię aplikację kątową, w której wiersze tabeli mają każdy przycisk, a po kliknięciu tych przycisków powinna zostać dodana nowa zakładka otwarty dla wiersza, w którym przycisk jest włączony.ui-router: stan otwarty w nowej karcie z target = "_ blank", utracono parametry

Musiałem przekazać parametry do nowej zakładki utworzonej w ten sposób. Mam ogłoszony parametr w inicjalizacji Stan:

.state('viewlisting', { 
    url: "/listings/:id", 
    params: { 
    'action': '', 
    }, 
    controller: 'ListingsController', 
    templateUrl: "partials/listings/view_listing.html" 
}); 

i przycisk ma coś takiego:

ui-sref='viewlisting({id:"+data+", action:"images"})' 

params są przekazywane w, wszystko działa zgodnie z oczekiwaniami.

//URL: /#/listings/42 
$state.params.action //returns "images" 
$state.params.id //returns "42" 

Ale dodanie target="_blank" do znacznika <a> powoduje $ state.params obiekt do powrotu następujące:

//URL: /#/listings/42 
$state.params.action //returns "" 
$state.params.id //returns "42" 

Rozglądałem się przez kilka godzin, szukałem w dokumentacji routera-ui oraz narzędzie do śledzenia problemów, które dotyczy mojej sytuacji, ale niczego nie znalazłem.

Czy parametry stanu nie są przekazywane na łączach target='_blank' "ed ui-sref?

Odpowiedz

5

Jeśli istnieje jakikolwiek parametr, który powinien być dostępny poza obecnym kontekście SPA (nowe okna, nowa karta) - to MUST być częścią adresu URL.

to będzie działać:

.state('viewlisting', { 
    // instead of this 
    // url: "/listings/:id", 
    // this will keep the action in a new window 
    url: "/listings/:id?action", 
    params: { 
    'action': '', 
    }, 
    controller: 'ListingsController', 
    templateUrl: "partials/listings/view_listing.html" 
}); 

Więcej szczegółów o params How to pass parameters using ui-sref in ui-router to controller

+0

Dziękuję za to .. jakoś wiedziałem, że to możliwe, ale chciałem zachować parametr działania z URL. Chcę tylko zapytać, czy istnieje sposób, w którym mogę zmienić wynikowy URL '/ listings/42? Action = images' na' listingings/42'. –

+0

Odpowiedź powinna być teraz jasna (to znaczy po mojej odpowiedzi) - NIE, to niemożliwe. URL to jedyny sposób na rozmowę ze światem zewnętrznym. I to jest nowa karta, nowe okno lub tylko link wysyłany pocztą e-mail. Wszystkie potrzebne parametry muszą być osadzone w adresie URL. Czy teraz jest jasne? –

+0

Uczyniłeś to całkiem dobrze, pytałem się, jak zmienić adres URL napisany na pasku adresu na 'listingi/42' po'/listings/42? Action = images'. To nie tak, że odrzucam twoją odpowiedź, po prostu nie chcę wystawiać tego parametru użytkownikowi, więc pomyślałem, czy mogę zmienić adres URL PO załadowaniu strony. –

0

Jest też inny sposób bez korzystania z adresu URL. Zamiast adresu URL możesz użyć adresu LocalStorage.

Użyj ng-click na łączu i wywołaj funkcję. W funkcji wpisz swoje parametry w LocalStorage. Następnie użyj opcji i sprawdź, czy LocalStorage ma parametry. Następnie uzyskaj params i zadzwoń $state z params.

//in page controller: 
 
var openNewTab = function() {     
 
        localStorage.newTab = JSON.stringify({ 
 
         state: "yourState", 
 
         params: { 
 
          param1: "someparam1", 
 
          param2:"someparam2" 
 
         } 
 
        });     
 
        window.open(document.location.origin); 
 
         
 
       } 
 
    
 
//angular app run config: 
 
angularApp.run(function($state){ 
 
if(localStorage.newTab){ 
 
    var newTab = JSON.parse(localStorage.newTab); 
 
    localStorage.removeItem("newTab"); 
 
    $state.go(newTab.state, newTab.params); 
 
    event.preventDefault(); 
 
} 
 
})
<a ng-click="openNewTab()" >open new tab</a>