【问题标题】:how to update a vaiable in component.ts file from another ts file如何从另一个 ts 文件更新 component.ts 文件中的变量
【发布时间】:2017-11-26 15:57:11
【问题描述】:

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

一旦我得到用户名,我将能够进行 api 调用,但我的用户名只有在登录成功后才可用。

我的 app.html 有这个,下面的代码是我的侧边菜单的一部分

<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 文件中提供姓名和电子邮件,我将看不到任何内容

【问题讨论】:

  • 请检查我的答案

标签: angular ionic2 ionic3


【解决方案1】:

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

请看一下这个参考,它可能对你有帮助:https://stackoverflow.com/a/44453536/6606630

【讨论】:

    【解决方案2】:

    你必须借助事件发射器

    查看此链接

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

    还有这个

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

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

    【讨论】:

      【解决方案3】:

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

      首先通过 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 使用的模式,这是一个很好的参考点。

      【讨论】:

      • @MohanGopi 您可以在 app.component.ts 和 home.ts 中使用 UserData 提供程序,方法是将其注入这两个组件中。因此,UserData 提供者将保存 'name' 和 'email' 变量,而不是 app.component.ts,然后可以由 getter 和 setter 访问。
      【解决方案4】:

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

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

      - 当用户更新时,在HomePage(或者你想要的页面)调用这个函数。
      为此,您需要完成一些步骤:
      Step1:将你的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

      【讨论】:

      • 我试过你的答案检查这个@Inject(forwardRef(() =&gt; AppComponent)我收到错误,实际语法是@Inject('MyEngine') public appComponent: AppComponent
      • myengine 不是一类我不知道我的引擎是什么
      • 嗯。那么为什么你有这个代码@Inject('MyEngine') public appComponent: AppComponent。该代码有什么错误:@Inject(forwardRef(() =&gt; AppComponent)?
      【解决方案5】:

      在 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');
      }
      

      【讨论】:

      • 你救了我的命 :)
      猜你喜欢
      • 2020-09-15
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多