2015-10-20 12 views
7

Tôi đang làm một ứng dụng Góc, trong đó các hàng của bảng có một nút và mỗi lần nhấp vào các nút này sẽ là tab mới đã mở cho hàng mà nút đó đang bật.ui-router: trạng thái mở trong tab mới với target = "_ blank", thông số bị mất

tôi cần phải vượt qua các thông số vào tab mới được tạo ra theo cách này. Tôi đã tuyên bố tham số trong việc khởi tạo trạng thái:

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

và nút có một cái gì đó như thế này:

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

Các params được thông qua tại, mọi thứ hoạt động như mong đợi.

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

Nhưng thêm target="_blank" cho thẻ <a> làm cho $ state.params đối tượng để trả lại như sau:

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

Tôi đã tìm kiếm nhiều giờ, tôi đã xem xét các tài liệu ui-router và bộ theo dõi vấn đề cho một cái gì đó giải quyết tình hình của tôi nhưng tôi đã không tìm thấy gì cả.

Thông số trạng thái không được chuyển trên các liên kết target='_blank' 'ed ui-sref?

Trả lời

5

Nếu có bất kỳ tham số mà nên có sẵn bên ngoài bối cảnh hiện tại SPA (cửa sổ mới, tab mới) - nó PHẢI là một phần của url.

này sẽ làm việc:

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

Thông tin chi tiết về params How to pass parameters using ui-sref in ui-router to controller

+0

Cảm ơn bạn đã này .. bằng cách nào đó tôi biết điều này là có thể nhưng tôi muốn giữ thông số hành động từ URL. Tôi chỉ muốn hỏi nếu có một cách mà tôi có thể thay đổi url kết quả '/ danh sách/42? Action = images' thành' danh sách/42'. –

+0

Câu trả lời phải rõ ràng ngay bây giờ (ý tôi là sau câu trả lời của tôi) - KHÔNG, điều đó là không thể. URL chỉ là cách để nói chuyện với thế giới bên ngoài. Và đó là tab mới, cửa sổ mới hoặc chỉ một liên kết gửi qua email. Tất cả các thông số cần thiết phải được nhúng vào url. Bây giờ đã rõ chưa? –

+0

Bạn đã làm rõ điều đó khá rõ, tôi đã hỏi cách thay đổi URL được viết trên thanh địa chỉ thành 'danh sách/42' SAU '/ danh sách/42? Action = images'. Nó không phải là nếu tôi từ chối câu trả lời của bạn, tôi chỉ không muốn để lộ các tham số cho người dùng, vì vậy tôi đã suy nghĩ nếu tôi chỉ có thể thay đổi URL SAU khi trang tải. –

0

Có một cách khác mà không sử dụng các URL. Bạn có thể sử dụng LocalStorage thay vì URL.

Sử dụng ng-click trên thẻ liên kết và gọi hàm. Trong hàm, hãy đặt các tham số của bạn trong LocalStorage. Sau đó, trong app.run hãy sử dụng $rootScope.$on("$stateChangeStart") và kiểm tra xem LocalStorage có thông số hay không. Sau đó, nhận params và gọi $state với 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>

Các vấn đề liên quan