如何从另一个ts文件更新component.ts文件中的vaiable

时间:2017-06-23 07:07:36

标签: angular ionic2 ionic3

最初我的app.component.ts文件被加载然后我有两个变量nameemail这是从API get调用更新的,为了进行这个api调用我需要用户名如果​​我没有用户名我将无法更新此名称和电子邮件。

一旦我获得了用户名,我就可以拨打api电话,但我的用户名只有在登录成功后才可用。

我的app.html有这个,下面的代码是我的sidemenu的一部分

<ion-item class="profile-info">
  <ion-icon name="person" item-left></ion-icon>
  <h2>{{name}}</h2>
  <p class="se-email">{{email}}</p>
</ion-item>

我的app.component.ts文件有此

name 
 email

 if(localStorage.getItem("username")){
   //here it is invoking 2nd time because i have stored the username after login so no problem
    this.getUserDetails();//this function call the same api 
  }else{
    //at first thime i am not able update the name and email because i dont have username 
    //so i am trying to update the name with set and get method where it will return my data 
    this.name =this.service.getUserName();
    this.email = this.service.getUserEmail();
  }

问题

  

我无法从主页或登录页面更新名称和电子邮件变量

     

如何从home.ts或login.ts等其他页面更新我的app.component.ts文件

更新:

我的完整app.html页面

<ion-menu [content]="content">
  <ion-header id="slidermenu_header">
    <ion-toolbar>
      <ion-title style="padding: 0 8px 4px;">SEcure Me</ion-title>
    </ion-toolbar>
  </ion-header>

  <ion-content class="slidermenu_content">
    <ion-list style="margin: -1px 0 24px -5px;">
      <ion-item class="profile-info">
          <ion-icon name="person" item-left></ion-icon>
          <h2 >{{name}}</h2>
          <p class="se-email">{{email}}</p>
      </ion-item>
    </ion-list>
    <div id="slidermenulist">
      <ion-item *ngFor="let p of pages" (click)="openPage(p)" menuClose>
        <ion-icon [name]="p.icon" item-left></ion-icon>
          {{p.title}}
      </ion-item>
    </div>
  </ion-content>
</ion-menu>

<!-- Disable swipe-to-go-back because it's poor UX to combine STGB with side menus -->
<ion-nav [root]="rootPage" #content swipeBackEnabled="false"></ion-nav>

从上面的代码中你可以看到我在我的应用程序中只使用了一个侧面菜单但是如果我在很多页面上使用这个侧面菜单

如果我想更新我的姓名和电子邮件,我必须转到我的app.component.ts文件,如this.name="username"' and this.email =“email@gmail.com”`工作正常

同样如果我在home.ts文件中给出姓名和电子邮件,我无法看到任何内容

5 个答案:

答案 0 :(得分:7)

app.component.ts中的

import { Events } from 'ionic-angular';
constructor(public events: Events) {
   events.subscribe('user:login', () => {
     this.loggedIn();
   });
}

loggedIn() {
  console.log("logged in");
}

在调用页面中:

import { Events } from 'ionic-angular';
constructor(public events: Events) {
  this.logIn();
}

logIn() {
  events.publish('user:login');
}

答案 1 :(得分:1)

我的建议是创建一个用户数据提供程序,它是所有用户属性的单一来源,并可通过将其注入其他组件而在整个应用程序中访问。

首先通过Ionic CLI生成提供程序:

ionic generate provider user-data

这将为您创建一个模板提供程序,然后您可以使用自己的方法填充,例如名称和电子邮件的getter和setter,以下是我在其他项目中完成的方法:

import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';

@Injectable()
export class UserData {

  private name: string;
  private email: string;
  constructor(private storage: Storage) {
    this.getName().then((name) => {
      this.name = name;
    });
    this.getEmail().then((email) => {
      this.email = email;
    });
  }
  // Gets name from provider instance variable or storage if undefined.
  public getName(): Promise<string> {
    if (this.name) {
      return Promise.resolve(this.name);
    }
    else {
      return this.storage.get('name').then((name) => {
        this.name = name;
        return name;
      });
    }
  }
  // Gets email from provider instance variable or storage if undefined.
  public getEmail(): Promise<string> {
    if (this.email) {
      return Promise.resolve(this.email);
    }
    else {
      return this.storage.get('email').then((email) => {
        this.email = email;
        return email;
      });
    }
  }

  public setName(name: string): void {
    this.name = name;
    this.storage.set("name", name);
  }

  public setEmail(email: string): void {
    this.email = email;
    this.storage.set("email", email);
  }
}

接下来,您需要在提供商中定义所需的所有方法后,需要将其导入app.module.ts文件并将其添加到providers数组中。

然后,您可以将提供程序注入要访问用户数据的组件中:

import { Component } from '@angular/core';
import { UserData } from '../../providers/user-data';

export class SomeComponent {

  constructor(private userData: UserData) {
    console.log(userData.getName());
    console.log(userDate.getEmail());
  }
}

此模式类似于官方Ionic示例应用程序或Ionic Conference App使用的模式,这是一个很好的参考点。

答案 2 :(得分:0)

在这种情况下,您必须使用服务并在服务中定义该变量,并且整个应用程序都可以访问此服务。

请查看此参考,它可能会对您有所帮助:https://stackoverflow.com/a/44453536/6606630

答案 3 :(得分:0)

你必须得到事件发射器的帮助

查看此链接

https://github.com/rahulrsingh09/AngularConcepts/tree/master/src/app/parentchild

和这个

https://angular.io/api/core/EventEmitter

您还可以使用相同的服务i:e当用户登录时,以及当应用程序组件加载从服务中获取值以显示该信息时,在服务中保存信息。

答案 4 :(得分:0)

我检查了你的更新问题,这是我的回答:
- 首先,创建一个函数来更新AppComponent中的变量:

update(){
   this.name =this.service.getUserName();
   this.email = this.service.getUserEmail();
}

- 在用户更新时,在HomePage(或您想要的页面)中调用此功能。
要做到这一点,你需要经历一些步骤:
第1步:在AppComponent中注入HomePage

import { Component,Inject,forwardRef } from '@angular/core';
import {AppComponent} from '../app/app.component'
@Component({
   selector: 'page-home',
   templateUrl: 'page-home.html',
   providers:[AppComponent]
})
constructor(@Inject(forwardRef(() => AppComponent)) appComponent: AppComponent){
}
login(){
   //Do the login
   //When logged in update the varible
   this.appComponent.update();
}

请参阅this answer

中的详细信息