2017-04-21 62 views
0

這裏是我的服務角4 PouchDB沒有更新服務

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; 
    } 
} 

爲什麼在午餐服務的更改變量未在組件反映?控制器中的午餐參數不會被填充。

我猜它不是在變化檢測?但如何使這項工作?

回答

1

爲了解決這個問題,我結束了下面的下面。由於服務中的數據將被共享,這似乎是一個令人滿意的解決方案,但我不確定它是最好的。

我提取袋數據庫交互的新的服務來回報可觀察到的:

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

} 

它工作正常,組件更新良好。我只是有點不確定這是否是正確的技術?我需要兩次訂閱嗎?

一般(非袋DB /普通HTTP調用)我可以指定服務變量,而不行爲主體,而這將很好地工作,並反映在組件/ UI的任何變化。但隨着袋使用一個然後我不得不轉換爲可觀察並獲得數據的方式。

有什麼想法?