ui-router: открытое состояние в новой вкладке с target = «_ blank», параметры потеряны

Я работаю с приложением Angular, в котором в каждой строке таблицы есть кнопка, и при нажатии этих кнопок должна быть открыта новая вкладка для строки, в которой находится кнопка.

Мне нужно было передать параметры в новую вкладку, созданную таким образом. Я объявил параметр в состоянии инициализации:

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

и кнопка имеет что-то вроде этого:

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

Параметры передаются, все работает как положено.

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

Но добавив target="_blank" в <a> тег заставляет объект $ state.params возвращать следующее:

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

Я искал несколько часов, я посмотрел документацию по ui-router и средство отслеживания проблем, чтобы найти решение, которое соответствует моей ситуации, но я ничего не нашел.

Параметры состояния не передаются в target='_blank' 'ed ui-sref ссылки?

7 голосов | спросил Ralph Sto. Domingo 20 +03002015-10-20T12:22:18+03:00312015bEurope/MoscowTue, 20 Oct 2015 12:22:18 +0300 2015, 12:22:18

2 ответа


0

Если есть какой-либо параметр, который должен быть доступен вне текущего контекста SPA (новое окно, новая вкладка) - он ОБЯЗАН быть частью URL-адреса.

Это будет работать:

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

Подробнее о параметрах Как передавать параметры с помощью ui-sref в ui-router на контроллер

ответил Radim Köhler 20 +03002015-10-20T14:13:21+03:00312015bEurope/MoscowTue, 20 Oct 2015 14:13:21 +0300 2015, 14:13:21
0

Есть другой способ без использования URL. Вы можете использовать LocalStorage вместо URL.

Используйте ng-click в теге ссылки и вызовите функцию. В функции поместите ваши параметры в LocalStorage. Затем в app.run используйте $rootScope.$on("$stateChangeStart") и проверьте, LocalStorage имеют параметры. Затем получите params и вызовите $state с помощью ---- +: = 8 = + ----.

 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();
}
})
ответил hamzeh.mm 21 WedEurope/Moscow2016-12-21T10:46:53+03:00Europe/Moscow12bEurope/MoscowWed, 21 Dec 2016 10:46:53 +0300 2016, 10:46:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132