Jos*_*ana 3 rxjs ionic-framework ionic2 angular
在我的Angular2应用程序中,我有一个暴露在视图中的rx Observable.此observable在商店中创建,并通过subject.asObservable传递给组件
如果子页面上的操作启动该操作,我在访问主题时调用next()的页面引用时遇到问题,但如果它调用商店的页面相同,则它可以正常工作.
下面显示了这个项目的布局和流程,下面我将说明它在什么情况下失败.
base.store,包含主题next()调用
options: { collection: string };
_subject$: Subject<Array<any>>;
protected dataStore: {};
constructor(protected http: Http) { }
init(options) {
this.options = options;
this.dataStore = {};
this.dataStore[options.collection] = [];
this._subject$ = <Subject<Array<any>>>new Subject();
this.load();
}
load() {
this.http.get(endpointurl).map(response => response.json()).subscribe(
data => {
this.dataStore[this.options.collection] = data;
this._subject$.next(this.dataStore[this.options.collection]);
}),
err => console.log("Error load", err));
}
addEntity(entity: any) {
this.http.post(endpointurl, entity).subscribe(
data => this.load(),
err => console.log("Error addEntity", err));
}
Run Code Online (Sandbox Code Playgroud)
contacts.store,它将主题公开为可观察的
export class ContactStore extends BaseStore {
protected _subject$: Subject<Array<Contact>>;
options;
constructor(protected http: Http) {
super(http);
this.options = { collection: "contacts" };
this.init(this.options);
}
get contacts$() {
return this._subject$.asObservable();
}
addOrUpdateContact(contact: Contact) {
if(contact._id) this.updateEntity(contact);
else this.addEntity(contact);
}
Run Code Online (Sandbox Code Playgroud)
contacts.component,它使用observable并显示列表
public contacts$: Observable<Array<Contact>>;
constructor(private contactsStore: ContactStore) {
this.contacts$ = this.contactsStore.contacts$;
}
Run Code Online (Sandbox Code Playgroud)
contacts.view,显示联系人
<ion-item *ngFor="let contact of contacts$ | async">{{contact.name}}</ion-item>
Run Code Online (Sandbox Code Playgroud)
现在来说明问题,我使用以下代码行添加一个新的联系人; this.contactsStore.addOrUpdateContact(contact);
为了调试,我在任何地方附加了一个订阅事件到这个项目.我的发现似乎突出了这个问题.
来自contact.store内的订阅始终捕获添加并发出和更新.如果是活动页面,则来自contact.component内的订阅会执行此操作,但如果在我位于其他组件中时发生添加操作则不会执行此操作.
我如何确保它确实存在,或者一旦我返回页面就会自我刷新?
由于看起来问题是由于contacts.component中没有发生订阅事件引起的,我尝试使用ngZone和applicationRef.tick手动触发更新,但都没有解决问题.
为了帮助调试,我还在subject.next()之后立即发出事件"contacts.loaded".我在contacts.component上订阅了该事件.即使在视图未更新的情况下,它也会始终触发.我试过放入ChangeDetectorRef.detectChanges()无济于事.
我假设您不止一次提供服务.不要添加它providers: [],@Component()但不是@NgModule()那时你只获得整个应用程序的单个服务实例,否则你得到每个组件实例的服务实例.
| 归档时间: |
|
| 查看次数: |
2401 次 |
| 最近记录: |