2016-07-13 8 views
1

Ich habe Array mit Observable.from() im Konstruktor erzeugt und im Konstruktor ebenfalls abonniert, das Array wird aktualisiert, aber die Subscription-Methode funktioniert nicht. ich bin nicht console.log für die Daten bekommen, hier ist der CodeRxjs: Warum dieser Array-Stream keine neuen Werte erhält

@Component({ 
    selector: 'my-app', 
    template: ` 
     <input type="text" required 
     [(ngModel)]="inputValue" name="inputValue" > 
     <button (click)="addto()">submit</button> 
    }) 

das ist Klasse

export class first{ 

proxySubject; 
inputValue: string; 
array = []; 

constructor(){ 
this.proxySubject = Observable.from(this.array) 
this.proxySubject.subscribe(function(data){ 
     console.log(data)) 
} 

addto(){  
    this.array.push(this.inputValue) 
} 
} 
+1

Das wird keine neuen Array-Werte aufnehmen, wenn Sie 'von' aufrufen, nimmt es die Werte im Array und konvertiert diese sofort in einen Stream. Sie möchten wahrscheinlich ein "ReplaySubject" erstellen und die Array-Werte auf das Subjekt in Ihrem Konstruktor schieben und dann neue Werte in addto() einfügen. –

+0

Nichts passiert, ich konvertierte ProxySubject zu ReplaySubject – blackHawk

Antwort

3

Observable.from() Kontrollen nur einmal erwähnt Array, jedes Mal, wenn ein neues Abo erstellen beobachtbar gegeben . Was Sie suchen, ist ein beobachtbares Array. Einer der Ansätze kann benutzerdefinierte addItem() Funktion erstellen, die .push() neues Element zu einem Array und der Anruf mySubject.next(myArray) wird. Mit dieser Konfiguration können Sie mySubject abonnieren, um benachrichtigt zu werden, sobald sich der Inhalt des Arrays ändert.

EDIT:

myArray = []; 

mySubject = new BehaviourSubject(myArray); // store last version for new subscribtions 

addItem(item) { 
    myArray.push(item); 
    mySubject.next(myArray) 
} 

mySubject.subscribe(arr => console.log(arr)) 

EDIT 2 - Beobachter:

// doesnt really help anything 
let myObserverRefference; 

observable = Observable.create(function (observer) { 
    myObserverRefference = observer; 
}); 

addItem() { 
    myObserverRefference.next(myArray); 
} 
+0

Ich habe addTo Methode, die neuen Wert auf das Array drückt, lassen Sie das Thema vorerst mit der nächsten Methode vergessen – blackHawk

+0

Dies geschieht nie automatisch Sie müssen 'subject' benachrichtigen, um nächsten Wert zu emittieren oder schreibe benutzerdefinierter "Beobachter" wie in "neuer Beobachter" => {/ * ... */observer.next (myArray);}) ' – tomastrajan

+0

Jedes Mal, wenn das Array mit der Push-Methode in der addto-Methode geändert wird, wird es nicht erkannt by observable.from(), – blackHawk

0

sind nichts wert, dass diese Kernfunktionalität in knockout.js ist und oft nur wenige Zeilen Code mit allen Glocken und Pfeifen von Array/Objekt ändern Ereignisse, die Sie genau dort wollen. Warum Dinge für solche trivialen Aufgaben zu kompliziert werden, verstehe ich nicht.

Verwandte Themen