2016-06-09 25 views
4

我一直在試驗feathersjs和angular2/Rx。 我想要實現的是構建一個angular2服務,以這種方式包裝一個feathersjs服務,以便人們可以訂閱一個Observable,在任何類型的CRUD之後發出最新的項目集。使用'CRUD-Observables'有效維護一組對象

它基本上工作。但是,我不覺得它的做法非常優雅: 包裝和解開所有進入的對象似乎效率不高。我是否'一切都很流'太過分?

getService(){ 
let data$: Observable<any> = Observable.from([initialSetOfItems]); 
let created$: Observable<any> = Observable.fromEvent(feathersService, 'created').map(o => {return {action: 'c', data: o}}); 
let updated$: Observable<any> = Observable.fromEvent(feathersService, 'updated').map(o => {return {action: 'u', data: o}}); 
let removed$: Observable<any> = Observable.fromEvent(feathersService, 'removed').map(o => {return {action: 'r', data: o}}); 

return data$ 
    .merge(created$, updated$, removed$) 
    .scan((arr: any[], newObj) => { 
    switch (newObj.action){ 
     case 'c': 
     return [].concat(arr, newObj.data); 

     case 'u': 
     let indexToUpdate = arr.findIndex((element) => (element.id === newObj.data.id)); 
     if (indexToUpdate > -1){ 
      arr[indexToUpdate] = newObj.data; 
     } 
     return arr; 

     case 'r': 
     return arr.filter(element => (element.id != newObj.data.id)) 
    } 
    }); 
} 

我知道這可能是自以爲是的。請多多包涵。 Rx有點難以纏繞你的頭。

你們會怎麼做到這一點?

+1

這就是我該怎麼做的。除了你的更新情況,你實際上是在修改陣列......我建議在應用更新之前克隆陣列。 – Brandon

+0

你是對的,謝謝! – j2L4e

回答

3

我認爲你正在尋找什麼feathers-reactive是應該做的。它是一個插件,可將任何服務方法轉換爲可自動更新實時事件的RxJS可觀察事件。它可以像這樣使用:

const feathers = require('feathers'); 
const memory = require('feathers-memory'); 
const rx = require('feathers-reactive'); 
const RxJS = require('rxjs'); 

const app = feathers() 
    .configure(rx(RxJS)) 
    .use('/messages', memory()); 

const messages = app.service('messages'); 

messages.create({ 
    text: 'A test message' 
}).then(() => { 
    // Get a specific message with id 0. Emit the message data once it resolves 
    // and every time it changes e.g. through an updated or patched event 
    messages.get(0).subscribe(message => console.log('My message', message)); 

    // Find all messages and emit a new list every time anything changes 
    messages.find().subscribe(messages => console.log('Message list', messages)); 

    setTimeout(() => { 
    messages.create({ text: 'Another message' }).then(() => 
     setTimeout(() => messages.patch(0, { text: 'Updated message' }), 1000) 
    ); 
    }, 1000); 
}); 

如果你想嘗試一下,我們希望得到一些反饋(和錯誤報告)。

+0

好東西,只要我找到時間,我會仔細看看!謝謝 – j2L4e