如何从ionic2中的服务更新页面?

时间:2016-08-09 19:07:38

标签: angular typescript ionic2 ionic3

我有一个名为“user-data”的服务,它负责在收到请求时获取“用户数据”。

我有一个页面负责显示“用户数据”。加载页面后,它会获取数据并显示。

我有一个菜单,其中包含一些按钮。点击这些按钮将向服务“用户数据”发送请求并修改数据。修改数据后,我希望页面获得有关更改的通知并调整页面。

我的工作是

  • 在服务中:发布名为“user:change”的事件,并使用修改后的数据发送
export class UserData{
    users = [];
    ....
    //- if data is changed, 
    //- publish an event
    setUsers(users) {
        this.users = users;
        this.events.publish('user:change', users);
    }
}
  • 在页面中,订阅以捕获此事件
export class UserListPage {
    users = [];

    //- subscribe when the page is about to show
    ionViewWillEnter() {
        this.events.subscribe('user:change', this.updateUsers);
    }

    //- subscribe when the page is about to show
    ionViewDidLeave() {
        this.events.unsubscribe('user:change', this.updateUsers);
    }

    //- update
    updateUsers(userEventData) {

        console.log('About to update');
        if (userEventData[0] instanceof Array) {
             this.users = userEventData[0];
        }
        console.log(this.users);
    }

} 

updateUsers 功能一切正常,但 this.users 未分配新值。这很奇怪。

有时候,当我调试时,我收到的错误如下:“试图分配给readonly属性”

你知道为什么吗?

2 个答案:

答案 0 :(得分:3)

我建议使用 Observables 而不是事件吗?即使您可以通过事件完成相同的操作,因为您使用服务来获取数据,这将是一种更好的方法。您可以在此处查看此working plunker中的代码。

所以沟通将是:

Btn / page ---[call the service]---> Service ---[notify other page and send data]---> Page

因此,在服务中,您可以创建一个observable,以便其他页面可以订阅它,并在数据准备好时收到通知。

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

@Injectable()
export class UserDataService  { 

  private getDataObserver: any;
  public getData: any;

  constructor() {
    this.getDataObserver = null;
    this.getData = Observable.create(observer => {
        this.getDataObserver = observer;
    });
  }

  public getUserData() {
    // Fake data to send to the page
    let userList = [
      { id: 1, name: 'user01 '},
      { id: 2, name: 'user02 '},
      { id: 3, name: 'user03 '}]

    // This simulates an http request
    setTimeout(() => {
      // The next method will notify all the subscribers and will 
      // send the data.
      this.getDataObserver.next(userList);
    }, 1000);
  }
}    

next(...)方法将通知所有订阅者(在这种情况下是另一个页面)并将向其发送数据。

然后在另一个页面中,您只需订阅该observable即可在数据可用时收到通知并按以下方式调用服务:

import { Component } from "@angular/core";
import { UserDataService } from 'service.ts';

@Component({
  templateUrl:"home.html"
})
export class HomePage {

  users: any[];

  constructor(private service: UserDataService) {
      // We subscribe to the observable to be notified when
      // the data is ready
        this.service.getData.subscribe((userList) => {
      this.users = userList;
    });
    }

  public getData(){
    this.service.getUserData();
  }
}

确保在App组件的UserDataService数组中添加providers,因此整个应用程序(单例服务)中将使用相同的实例。

import { Component } from "@angular/core";
import { ionicBootstrap, Platform } from 'ionic-angular/index';
import { HomePage } from './home.ts';
import { UserDataService } from 'service.ts';

@Component({
  template: '<ion-nav [root]="rootPage"></ion-nav>',
  providers: [UserDataService]
})
export class MyApp {
  constructor(private platform: Platform) {
    this.rootPage = HomePage;
  }
}

ionicBootstrap(MyApp);

答案 1 :(得分:0)

我唯一错误的是在单独的地方编写处理“updateUser”的函数。以下代码适用于我:

<pre>
export class UserListPage {
    users = [];

    //- subscribe when the page is about to show
    ionViewWillEnter() {
        this.events.subscribe('user:change', (userEventData){
            console.log('About to update');
            if (userEventData[0] instanceof Array) {
                  this.users = userEventData[0];
            }
            console.log(this.users);
        );
    }

    //- subscribe when the page is about to leave
    ionViewDidLeave() {
        this.events.unsubscribe('user:change', ()=>());
    }

}
</pre>