2016-11-22 41 views
11

Tôi mới dùng Ionic2 và tôi đang cố gắng tạo các tab động dựa trên lựa chọn menu hiện tại. Tôi chỉ tự hỏi làm thế nào tôi có thể nhận được trang hiện tại bằng cách sử dụng điều khiển chuyển hướng.Cách lấy trang hiện tại từ Điều hướng trong ionic 2

... 
export class TabsPage { 
    constructor(navParams: NavParams,navCtrl:NavController) { 
    //here I want to get current page 
} 
} 
... 

Từ tài liệu api tôi cảm thấy getActiveChildNav() hoặc getActive() sẽ cho tôi trang hiện tại, nhưng tôi không có kiến ​​thức về ViewController/Nav.

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn trước.

Trả lời

19

Full dụ:

import { NavController } from 'ionic-angular'; 

export class Page { 

    constructor(public navCtrl:NavController) { 
    } 

    (...) 

    getActivePage(): string { 
    return this.navCtrl.getActive().name; 
    } 
} 

Phương pháp để có được tên trang hiện:

this.navCtrl.getActive().name 

Chi tiết here

+0

điều này đã giúp tôi rất nhiều để ngăn chặn navCtrl đi (và khởi tạo tất cả những thứ trong đó!) Đến một Trang nơi chúng tôi đã có! Đặc biệt là kết hợp khi đăng ký với một người quan sát nhiều lần, mà kết thúc trong một lỗi! – pdewaard

-1

Bạn có thể sử dụng getActive để hoạt động ViewController. ViewControllercomponent và thể hiện của chế độ xem hiện tại. Vấn đề là phương pháp comparsion. Tôi đã đưa ra giải pháp với các thiết lập một số lĩnh vực như id:string cho tất cả các thành phần trang của tôi và sau đó so sánh chúng. Thật không may tên chức năng kiểm tra đơn giản như vậy getActive().component.name sẽ phá vỡ sau khi minification.

+0

Bạn nói đúng, và nếu bạn sử dụng so sánh thành phần 'getActive(). component === ComponentName'? Nó làm việc cho tôi. – Deivide

+0

Nhưng nó sẽ không hoạt động sau khi rút gọn mã vì tên sẽ được thay đổi. –

+0

Phương pháp này so sánh chính thành phần thay vì tên của nó. Như thể chúng ta đã so sánh như sau: '' 'x = y = function() {}; x === y; '' ' Bạn có hiểu không? – Deivide

4

OMG! Điều này thực sự giúp đỡ giao phối, tấn cảm ơn! @Deivide Tôi đã bị kẹt trong 1 tháng, Câu trả lời của bạn đã lưu tôi. :) Cảm ơn!

if(navCtrl.getActive().component === DashboardPage){ 
    this.showAlert(); 
} 
else 
{ 
    this.navCtrl.pop();  
} 
+0

Thực sự ước gì tôi biết tại sao điều này không hiệu quả đối với tôi. – Cozzbie

+0

@ Cozzbie nó đã không làm việc cho tôi, hoặc, hóa ra giá trị không thể được truy cập trong constructor. Chỉ trong các hàm được thực hiện sau khi tải trang. Hy vọng rằng sẽ giúp. –

1

Nhóm của tôi phải tạo một thanh menu được chia sẻ tùy chỉnh riêng biệt, được chia sẻ và hiển thị với hầu hết các trang. Từ bên trong trình đơn thành phần này, gọi số this.navCtrl.getActive().name trả về tên trang trước đó. Chúng tôi đã có thể có được tên trang hiện trong trường hợp này sử dụng:

ngAfterViewInit() { 
let currentPage = this.app.getActiveNav().getViews()[0].name; 
console.log('current page is: ', currentPage); 
} 
0

this.navCtrl.getActive().name != TheComponent.name hoặc this.navCtrl.getActive().component !== TheComponent

cũng có thể

-1

navCtrl.getActive() có vẻ là buggy in certain circumstances, bởi vì nó sẽ trả về các ViewController sai nếu .setRoot vừa được sử dụng hoặc nếu .pop vừa được sử dụng, trong khi navCtrl.getActive() dường như trả về ViewController đúng nếu .push được sử dụng.

Sử dụng viewController phát ra bởi các viewDidEnter Quan sát thay vì sử dụng navCtrl.getActive() để có được chính xác hoạt động ViewController, như vậy:

navCtrl.viewDidEnter.subscribe(item=> { 
      const viewController = item as ViewController; 
      const n = viewController.name; 
      console.log('active page: ' + n); 
     }); 

Tôi đã thử nghiệm điều này trong đăng ký viewDidEnter, không biết về các sự kiện vòng đời khác ..

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