我有一个名为“user-data”的服务,它负责在收到请求时获取“用户数据”。
我有一个页面负责显示“用户数据”。加载页面后,它会获取数据并显示。
我有一个菜单,其中包含一些按钮。点击这些按钮将向服务“用户数据”发送请求并修改数据。修改数据后,我希望页面获得有关更改的通知并调整页面。
我的工作是
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属性”
你知道为什么吗?
答案 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>