2017-03-26 1 views
2

J'ai un historique BehaviourSubject $ de type EvaluateHistoryItem []. Dans la méthode uploadFile, je divise un fichier .txt téléchargé par des virgules, puis je les envoie à resultSet []. Je veux ajouter les valeurs de resultSet [] à l'historique $ BehaviorSubject.Ajouter des valeurs de array à BehaviorSubject

Je suis nouveau à RxJS, et je trouve ça compliqué (je travaille encore dessus). J'apprécierais de l'aide.


J'ai essayé quelque chose comme ça, mais il est inexact que je ne veux pas la carte, mais d'ajouter de nouvelles valeurs (je pense que ce devrait être quelque chose avec combineLatest):

history.map(a => { 
       a.saved = this.convertToBool(resultSet[0]); 
       a.evaluate = resultSet[1]; 
       a.result = resultSet[2]; 
       a.runTimeMs = Number(resultSet[3]); 
       a.tags.map(tag => tag.value = resultSet[4]); 

      }); 
this.history$.next(history); 

ps. Désolé si le titre de la question n'est pas bon.


Voici mon code:

interface EvaluateHistoryItem { 
evaluate: string; 
error?: string; 
result?: string; 
runTimeMs?: number; 
saved?: boolean; 
} 

export class EvaluateComponent implements OnInit, AfterViewInit { 
    ... ... ... 
    ... ... ... 
    public history$ = new BehaviorSubject<EvaluateHistoryItem[]>([]); 
    ... ... ... 
    public uploadFile(element: any) { 
     let uploadedFile = document.getElementById('uploadedFile'); 
     let files: File[] = element.srcElement.files; 
     let file: File = files[0]; 

     let reader = new FileReader(); 

     let resultSet: string[] = []; 

     reader.onloadend = (result) => { 
      // replace new lines with commas and then split upon commas but not the ones inside quotes 
      let columns: string[] = reader.result.replace(/\n/g, ',').split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/); 

      for (let i = 0; i < columns.length - 1; i++) { 
       resultSet.push(columns[i]); 
      } 
     }; 

    let history: EvaluateHistoryItem[] = this.history$.getValue(); 
    // ... here I need to map values from resultSet 
    // .... 
    this.history$.next(history); 
} 
+0

resultSet.splice (0, 4) supprimera les quatre premiers éléments. – Devid

Répondre

1

Les mots-clés que je lis dans votre question sont skip et bufferCount.

resultSet 
    .skip(4) /* first four emissions */ 
    .bufferCount(4) 
    .map(buffer => ({ 
    save: buffer[0], 
    evaluate: buffer[1], 
    result: buffer[2], 
    runTimeMs: buffer[3] 
    })) 
    .subscribe(console.log); 
+0

Je ne peux pas passer sur resultSet car resultSet est juste un tableau de chaînes. Pour expliquer un peu plus, je veux pousser les valeurs de resultSet dans hisotory $ qui est de type EvaluateHistoryItem []. – Devid