2017-02-22 11 views
1

Я обнаружил, что когда я пользуюсь службой внутри forEach, параметр, который я отправляю на услугу, выдает последний из тиражей.Angular2: как использовать наблюдаемое для вещательного события внутри forEach?

Я подумал, что это должно быть закрытия причины этой проблемой, поэтому я стараюсь использовать анонимную функцию, чтобы решить эту проблему, но не работает

Пропустите OBJ в компоненте

эта функция вызывается в ngOnInit может вызвать проблемы,

, когда я ставлю этот код в событие щелчка, он отлично работает

for (var y = 0; y < this.model.data.length;y++) { 
     if (this.model.data[i].to[x].id === this.model.data[y].id) { 
      let obj = { 
       selectedItem : this.model.data[i], 
       item : this.model.data[y] 
      };  
      (function(_obj,a) { 
       console.log ('obje in component:'); 
       console.log (_obj.item.id) //each obj over here is correct now 

       a._drawLineService.drawLine(_obj); 
       a._dragLineService.dragLine(_obj.item); 
      })(obj,this)         
     } 
    } 

Получить OBJ в директиве

this.subscription = this._drawLineService.drawLine$ 
    .subscribe(obj => { 
     console.log ('drawLine:')  
     console.log (obj.item.id) //each obj over here become the last one of array                  
    }); 

Я использую наблюдаемую передать событие и параметр от компонента к директиве

Моя служба

import {Injectable}  from '@angular/core' 
import {BehaviorSubject} from 'rxjs/BehaviorSubject'; 

@Injectable() 
export class DrawLineService { 
    private _drawLine = new BehaviorSubject<any>(''); 
    drawLine$ = this._drawLine.asObservable(); 
    drawLine(item) { 
    this._drawLine.next(item); 
    } 
} 

консоли Результат:

enter image description here

Как решить эту проблему?

ответ

1

изменение var obj=... к let obj=...

let определить переменную, чтобы блокировать сферу, а var определить переменную для функции или глобальный масштаб.

Фактически вы переписываете переменную obj своей петлей.

+0

не работает: (все еще последний –

+1

Я думаю, что это связано с порядком вашей подписки и вашей петли. Я выставил плункер, который работает: https://plnkr.co/edit/nR9PL5b8bS5OenZNJNBM?p=preview – user3682091

+0

Я положил его в 'ngOnInit()', возможно, это вызвало эту проблему, когда я использую событие click для его запуска, он работает нормально, но почему? См. Этот plunker [https://plnkr.co/edit/alQFlYEFL3G6jvBsUl2s?p = preview] (https://plnkr.co/edit/alQFlYEFL3G6jvBsUl2s?p=preview) –