2016-07-13 1 views
1

Я создал поток массива с использованием Observable.from() в конструкторе и подписался на него в конструкторе тоже, массив получает обновление, но метод подписки не работает, я думаю, Я не получаю console.log для данных, вот кодаRxjs: Почему этот поток массива не принимает новые значения

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

это класс

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

Это не будет воспринимать новые значения массива, когда вы вызываете «from», он принимает значения в массиве и немедленно преобразует их в поток. Вероятно, вы захотите создать «ReplaySubject» и нажать значения массива на объект в своем конструкторе, а затем нажать новые значения в addto(). –

+0

Ничего не случилось, я преобразовал proxySubject в ReplaySubject – blackHawk

ответ

3

Observable.from() проверяет упомянутый массив только один раз, каждый раз, когда вы создаете новую Подписку на данные наблюдаемом , То, что вы ищете, является наблюдаемым массивом. Одним из подходов может быть создание пользовательской функции addItem(), которая будет .push() нового элемента массиву и вызова mySubject.next(myArray). С помощью этой настройки вы можете подписаться на mySubject, чтобы получать уведомления о каждом изменении содержимого массива.

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 - наблюдатель:

// doesnt really help anything 
let myObserverRefference; 

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

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

У меня есть метод addTo, который подталкивает новое значение к массиву, позволяет забыть о предмете в настоящее время со следующим методом. – blackHawk

+0

Это никогда не произойдет автоматически. У вас есть, чтобы уведомить 'subject', чтобы испустить следующее значение или писать пользовательский 'observer', как в' new Obserable (observer => {/ * ... */observer.next (myArray);}) ' – tomastrajan

+0

каждый раз, когда массив изменяется с помощью метода push в методе addto, он не будет обнаружен by observable.from(), – blackHawk

0

ничего не стоит, что в knockout.js это основные функциональные возможности, и часто только несколько строк кода со всеми колоколами и свистки событий смены массива/объектов, которые вы хотите прямо там. Почему все вещи становятся слишком сложными для таких тривиальных задач, я не понимаю.

Смежные вопросы