2017-10-04 10 views
0

저는 아직 학습자입니다. 이온뿐만 아니라 각도에서도 그렇습니다.Ionic2 : 서비스에서 NavController를 사용할 수 없습니다.

일부 페이지를 작성했으며 사용자가 모든 기본 페이지를 전환 할 수있는 모든 페이지에 꼬리말을 추가하려고합니다. 두 번째 페이지를 작성한 후에도 동일한 방법을 다시 사용했기 때문에 서비스를받는 것이 좋을 것임을 알았습니다. 여기

내 서비스가 지금 모습입니다 :

export class Navigation { 
    public navCtrl: NavController; 

    onLoadHome(){ 
    this.navCtrl.push(HomePage); 
    } 
} 

지금 나는 다음과 같은 오류 가지고있는 HTML 템플릿에 Navigator.onLoadHome()를 호출 할 때 : 재산 '푸시'의를 읽을 수 없습니다를 정의되지 않았습니다.

그래서 내 앱이 서비스를 찾고 그 방법을 찾았 음을 알았습니다. 하지만 내 navCtrl은 정의되지 않았습니다. 나는 다음을 수행하여 다른 방법을 시도 :

export class Navigation { 
    constructor(private navCtrl: NavController){} 

    onLoadHome(){ 
    this.navCtrl.push(HomePage); 
    } 
} 

는 지금은 또 다른 오류 메시지가 : 탐색을위한 모든 매개 변수를 확인할 수 없습니다.

나는이 일을하기 위해 무엇을해야할지 정말로 모른다. 네가 나를 도울 수 있기를 바랍니다.

(BTW. 나는 조금 클래스를 단축했습니다.하지만 다른 방법은 다른 페이지에 대한 onLoadHome 같은 동일한 않습니다.)

+0

처럼 될 것 같은이 게시'NavController' –

+0

['NavController'] (https://ionicframework.com/docs/api/navigation/ 보인다 NavController /)는 페이지/구성 요소에만 삽입되어야합니다. –

+0

당신은'onLoadHome (navCtrl : NavController)'와 같이'NavController' 객체를'onLoadHome()'함수에 전달할 수 있습니다. – hrdkisback

답변

3

그것은 페이지 사이를 탐색하는 좋은 방법은 아니지만 나는이 힘을 바란다 당신이 서비스를 사용할 페이지에서 당신에게

도움, 당신은 당신이 이동하고자 할 때 바로 호출이

public mNavigation: Navigation; 

constructor(public navCtrl: NavController, public navParams: NavParams) { 
    this.mNavigation = new Navigation(navCtrl) 
} 

처럼 설정 한 후 서비스를 가져 돼 this.mNavigation.onLoadHome();


더 좋은 방법은 NavCtrl 대신 NavApp으로 사용하는 것입니다. 이

import { App } from 'ionic-angular'; 

@Injectable() 
export class NavigationProvider { 

    constructor(public app: App) { 
    } 

    onLoadHome(){ 
    this.app.getActiveNav().push(HomePage); 
    } 
} 

다음 페이지가이

constructor(public navCtrl: NavController, 
    public mNavigationProvider: NavigationProvider, 
    public navParams: NavParams) { 
    } 

    onNavigate() {  
    this.mNavigationProvider.onLoadHome(); 
    } 
+0

이 중 하나를 시도했지만 런타임 오류가 계속 발생합니다 : '탐색을위한 모든 매개 변수를 해결할 수 없습니다'. 그렇다면 페이지간에 이동하는 좋은 방법이 아닌 이유는 무엇입니까? –

+0

"서비스에서보기 (MVC가 깨졌습니다)를 변경하는 것은 좋지 않지만 서비스에서 주 컨트롤러로 이벤트를 보내고 컨트롤러에서 NavController (가장 좋은 방법)를 사용할 수도 있고 NavController를 다음과 같이 서비스에 보낼 수도 있습니다 서비스를 사용하는 대신 구성 요소를 만들어야 할 수도 있습니다. " 방금 ​​다른 방법을 추가 했으므로 시도해야합니다 –

+0

먼저 두 번째 예제가 완벽하게 작동했습니다. 고마워. :) 귀하의 조언을드립니다. 즉, 내비게이션 구성 요소를 작성해야합니다. 이 방법에서는 모든 메소드를 기록한 다음이 컴포넌트를 모든 페이지의 새로운 바닥 글로 사용할 수 있습니다. 내가 너를 정확하게 이해 했니? –