2016-12-12 1 views
4

상황 : 내 app.component에서이온이 2 - 전역 변수를 저장하는 방법?

로그인 기능이 있습니다. 그것은 제대로 작동하고 API에서 사용자 데이터를 얻을.

이 데이터를 앱 전체에 액세스하려면 전역 변수로 저장해야합니다.

나는 서비스를 공유하는 것이 그 일을하는 방법이라고 생각했지만, 불행히도 내가 생각한 것처럼 작동하지는 않는다.

강령 :

서비스 :

import { Injectable } from '@angular/core'; 

@Injectable() 
export class LoginService { 

    public accountInfo; 

    setUserData(value) 
    { 
    this.accountInfo = value; 
    } 

    getUserData() { 
    return this.accountInfo; 
    } 

} 

app.component :

loginSubmit() 
{ 
    // Function reduced to what is essential to the question 

    this.userService.submitLogin(email, password) 
     .subscribe((response) => { 

      if(response.result == 1) 
      { 
       this.loginService.setUserData(response.account_info); 

       var justTesting = this.loginService.getUserData(); 

       // Getting the proper result back 
       console.log(justTesting); 
      } 

     }, (error) => { 
      console.log(error); 
     }); 
} 

다른 구성 요소로부터 사용자 데이터에 액세스를 시도 :

this.accountInfo = this.loginService.getUserData(); 
console.log(this.accountInfo); 

결과는 undefined입니다. 아마 ... this.accountInfo합니다 (서비스)를 다시 인스턴스화하는 서비스가 다른 구성 요소에서 호출 될 때 때문에

질문 :

가 어떻게 전역 변수로 일부 데이터를 저장할 수 있습니까? 서비스를 공유하여 완료 할 수 있습니까?

감사합니다.

+0

당신이)'this.accountInfo = this.loginService.getUserData (얻기 위해 노력하고있다, 그것은 비어있는 경우 만 그것은이다''은'setUserData (값) 안에 무엇인지 확인 undefined를 반환하면 설정된 사용자 데이터를 확인해야합니다 –

+0

하지만 setUserData는 전역 변수를 설정하기 위해 호출 한 함수입니다. – johnnyfittizio

+1

예, 이해했습니다!. 당신의 페이지 중 하나에서'this.loginService.setUserData ('wellcome');'을 시도한 다음'this.loginService.getUserData();와 같은 다른 페이지에서 값을 얻으려고 시도한다. . –

답변

2

@ 매트의 대답은 제대로 작동하고이 문제에 대한 좋은 해결책을 제공합니다.

또한 내 코드에서 문제점이 발견되었습니다. 서비스는 싱글 톤이어야했습니다. 대신 구성 요소의 공급자에 서비스를 주입하고있었습니다.

서비스가 다시 인스턴스화되어 따라서 public accountInfo이 이전 콘텐츠를 잃어 버렸기 때문에 이것이 문제가되었습니다.

글로벌 변수를 저장하기 위해 서비스를 공유 할 수 있지만 싱글 톤이어야합니다. app.module에 한 번만 삽입해야합니다.TS : 페이지에서

providers: [ LoginService ] 
+1

이것은 각도 (및 이오니아) 방식으로 수행하므로 가장 많이 상향 된 답변이어야합니다. – andreas

2

Ionic은 Storage 플러그인으로 전역 변수를 저장하는 방법을 제공합니다. (cordova-sqlite-storage). 저장소는 IndexedDB, WebSQLlocalstorage을이 순서로 사용하려고 시도합니다.

먼저 공급자 목록에 추가하십시오.

구성 요소에 주입 한 후

import { Storage } from '@ionic/storage'; 

@NgModule({ 
    declarations: [ 
    // ... 
    ], 
    imports: [ 
    IonicModule.forRoot(MyApp) 
    ], 
    bootstrap: [IonicApp], 
    entryComponents: [ 
    // ... 
    ], 
    providers: [ 
    Storage 
    ] 
}) 
export class AppModule {} 

src/app.module.ts에서 그리고

import { Storage } from '@ionic/storage'; 

export class MyApp { 
    constructor(storage: Storage) { 

    // set a key/value 
    storage.set('name', 'Max'); 

    // Or to get a key/value pair 
    storage.get('name').then((val) => { 
     console.log('Your name is', val); 
    }) 
    } 
} 
+1

고맙습니다! 내 코드가 잘못되었습니다.이 서비스는 싱글 톤이 아니었지만 솔루션을 테스트 한 결과 매우 효과적이었습니다. 한 가지 질문 : 저장소는 기본적으로 이온 1 용 localStorage였습니까? 따라서이 방법으로 데이터는 앱이 폐쇄 될 것입니까? – johnnyfittizio

+0

네이티브 앱 컨텍스트에서 실행될 때 Storage는 가장 안정적이며 널리 사용되는 파일 기반 데이터베이스 중 하나이므로 SQLite를 사용하여 우선 순위를 지정하며 localstorage 및 IndexedDB와 같은 몇 가지 함정을 피합니다. 와 같은 운영 체제는 낮은 디스크 공간 상황에서 이러한 데이터를 지우도록 결정합니다. – Matt

관련 문제