Angular 4 PouchDB 未更新服务
Angular 4 PouchDB not updating service
这是我的服务
export class LunchService {
private db: any;
lunches: any = [];
constructor(
private serverService: ServerService,
private configService: ConfigService,
) {
this.db = new PouchDB(configService.config.dbServer + '/' + configService.config.dbName);
this.db.find({
selector: { 'type': 'lunch' },
}).then((result) => {
// HERE
this.lunches = result.docs;
}).catch(function(err) {
console.log(err);
});
}
}
这是我的组件
export class ListingComponent {
lunches: any = [];
constructor(
private lunchService: LunchService
) {
// IS EMPTY WHEN SET IN SERVICE?
this.lunches = this.lunchService.lunches;
}
}
为什么午餐服务中对变量的更改没有反映在组件中?控制器中的 lunches 参数不会被填充。
我猜它不在变化检测中?但是如何让它发挥作用呢?
为了解决这个问题,我得到了以下结果。由于服务中的数据将被共享,这似乎是一个令人满意的解决方案,但我不确定这是最好的。
我为 pouch DB 交互提取了一个新服务到 return 一个 observable:
export class PouchDbService {
private db: any;
constructor(
private configService: ConfigService
) {
this.db = new PouchDB(configService.config.dbServer + '/' + configService.config.dbName);
}
findDocs(searchParams) {
return new Observable(observer => {
this.db.find(searchParams).then((response) => {
observer.next(response);
}).catch((err) => {
console.log(err);
});
}
);
}
}
现在在我的午餐服务中我创建了一个行为主题:
export class LunchService {
lunches: any = new BehaviorSubject([]);
constructor(
private pouchDb: PouchDbService
) {
this.getLunches().subscribe((response) => {
this.lunches.next(response['docs']);
});
}
getLunches() {
return this.pouchDb.findDocs({
selector: { type: { $eq: 'lunch' } }
});
}
}
最后在我的组件中我再次订阅了:
export class ListingComponent implements OnInit {
lunches: any;
constructor(
private lunchService: LunchService
) { }
ngOnInit(): void {
this.lunchService.lunches.subscribe((lunches) => {
this.lunches = lunches;
});
}
}
它工作正常并且在组件中更新正常。我只是有点不确定这是否是正确的技术?我应该订阅两次吗?
通常(非 pouch 数据库/一般 http 调用)我可以只分配服务变量,而不是行为主题,这会很好地工作并反映组件中的任何更改/UI。但是由于袋子使用 a 然后我必须转换为可观察的并以这种方式获取数据。
有什么想法吗?
这是我的服务
export class LunchService {
private db: any;
lunches: any = [];
constructor(
private serverService: ServerService,
private configService: ConfigService,
) {
this.db = new PouchDB(configService.config.dbServer + '/' + configService.config.dbName);
this.db.find({
selector: { 'type': 'lunch' },
}).then((result) => {
// HERE
this.lunches = result.docs;
}).catch(function(err) {
console.log(err);
});
}
}
这是我的组件
export class ListingComponent {
lunches: any = [];
constructor(
private lunchService: LunchService
) {
// IS EMPTY WHEN SET IN SERVICE?
this.lunches = this.lunchService.lunches;
}
}
为什么午餐服务中对变量的更改没有反映在组件中?控制器中的 lunches 参数不会被填充。
我猜它不在变化检测中?但是如何让它发挥作用呢?
为了解决这个问题,我得到了以下结果。由于服务中的数据将被共享,这似乎是一个令人满意的解决方案,但我不确定这是最好的。
我为 pouch DB 交互提取了一个新服务到 return 一个 observable:
export class PouchDbService {
private db: any;
constructor(
private configService: ConfigService
) {
this.db = new PouchDB(configService.config.dbServer + '/' + configService.config.dbName);
}
findDocs(searchParams) {
return new Observable(observer => {
this.db.find(searchParams).then((response) => {
observer.next(response);
}).catch((err) => {
console.log(err);
});
}
);
}
}
现在在我的午餐服务中我创建了一个行为主题:
export class LunchService {
lunches: any = new BehaviorSubject([]);
constructor(
private pouchDb: PouchDbService
) {
this.getLunches().subscribe((response) => {
this.lunches.next(response['docs']);
});
}
getLunches() {
return this.pouchDb.findDocs({
selector: { type: { $eq: 'lunch' } }
});
}
}
最后在我的组件中我再次订阅了:
export class ListingComponent implements OnInit {
lunches: any;
constructor(
private lunchService: LunchService
) { }
ngOnInit(): void {
this.lunchService.lunches.subscribe((lunches) => {
this.lunches = lunches;
});
}
}
它工作正常并且在组件中更新正常。我只是有点不确定这是否是正确的技术?我应该订阅两次吗?
通常(非 pouch 数据库/一般 http 调用)我可以只分配服务变量,而不是行为主题,这会很好地工作并反映组件中的任何更改/UI。但是由于袋子使用 a 然后我必须转换为可观察的并以这种方式获取数据。
有什么想法吗?