web-dev-qa-db-ja.com

ionic 2サイドメニュー内の値を更新する方法

Ionic2のページからside-menuに日付を「転送」する方法。つまり、次のようにapp.page.htmlを使用します。

<ion-menu [content]="content">

    <ion-content class="menu-left">
        <!-- User profile -->
        <div text-center padding-top padding-bottom class="primary-bg menu-left">
            <a menuClose>
                <h4 light>{{userName}}</h4>
            </a>
        </div>

        <ion-list class="list-full-border">
            <button ion-item menuClose *ngFor="let page of pages" (click)="openPage(page)">
        <ion-icon item-left name="{{ page.icon }}"></ion-icon>
        {{ page.title }}
        <ion-badge color="danger" item-right *ngIf="page.count">{{ page.count }}</ion-badge>
      </button>
        </ion-list>
    </ion-content>

</ion-menu>

<ion-nav [root]="rootPage" #content swipeBackEnabled="false"></ion-nav>

facebookLogin.pageから取得したデータに基づいて、ページ内のアクションでuserName値を更新する方法は?

facebookLogin.page.ts

...
fbLogin() {
    Facebook.login(["public_profile", "email"])
      .then((resp: FacebookLoginResponse) => {

        if (resp.status === "connected") {
          Facebook.api("/me", ["public_profile", "email"])
            .then(res => {
             this.userName = res.name
              this.login({name: this.userName})
            })
        ...
      );
  }

 login(params) {
    this.nav.setRoot(HomePage, params);
  }
...

(つまり、Facebookでログインした後に取得したuserNameion-sideMenuapp.htmlにインポートするにはどうすればよいですかEventEmmiterservice/observe app.htmlのイオンメニューの変更について...他の方法?)

10
Vovan_Super

ionic2-イベントの使用

イベントをチェックしてください docs

これらを使用すると、任意のページからアクションを「公開」し、別のページでサブスクライブして値を取得できます。あなたのシナリオは少しこのようになります。

インポート(_Facebooklogin.component_と_app.component_の両方)

_import { Events } from 'ionic-angular';_およびコンストラクター内constructor(public events: Events)

次に、userNameを変更するたびに(つまり、Facebookログインのハンドラーで)、次のような値を公開します。

_fbLogin() {
    Facebook.login(["public_profile", "email"])
      .then((resp: FacebookLoginResponse) => {

        if (resp.status === "connected") {
          Facebook.api("/me", ["public_profile", "email"])
            .then(res => {
             this.userName = res.name
             // publish the username change to the events
             this.events.publish('username:changed', this.userName);
              this.login({name: this.userName})
            })
        //...
      );
  }
_

そして、あなたの_app.component_で行われている公開を購読します

_userName: string;

constructor(events: Events) {
   this.userName = "not logged in";

   events.subscribe('username:changed', username => {
      if(username !== undefined && username !== ""){
        this.userName = username;
      }
   }) //... 
}
_

angular2-EventEmitterを使用

_import { EventEmitter } from '@angular/core';

public userChanged = new EventEmitter();

fbLogin() {
        Facebook.login(["public_profile", "email"])
          .then((resp: FacebookLoginResponse) => {

            if (resp.status === "connected") {
              Facebook.api("/me", ["public_profile", "email"])
                .then(res => {
                 this.userName = res.name
                 // publish the username change to the events
                 this.userChanged.emit(this.userName);
                 this.login({name: this.userName})
                })
            ...
          );
      }
_

App.component

_import { FacebookLogin } from '../pages/facebook/facebook.component';

public userName;

constructor(fb: FacebookLogin){

    this.userName = "";
    //subscribe to the page's EventEmitter
    this.fb.userChanged.subscribe(username => {
       this.userName = username;
    });
}
_

または、このS.Oで説明されているように、EventEmitterOutputとして使用します。回答: EventEmitterの適切な使用法は何ですか?

15
Ivar Reukers