2016-05-07 4 views
0

Я работаю над приложением Angular2, и это работало нормально, пока не вышел RC1 (хотя он никогда не тестировался в RC0).Angular2 RC1 Service потерял начальные свойства

По существу у меня есть класс cacheService, который подписывается на темы в классе «remoteService». Любые компоненты относятся к cacheService.players вместо запроса на удаленный сервис. Я делаю это, потому что он также отключает слой кэширования приложений от удаленного сервиса, позволяя кеш-кешированию кэшировать, а remoteService - на удаленный сервис.

Однако при создании экземпляра компонента вызывается конструктор cacheService, который инициализирует массив players [].

Однако, когда remoteService испускает плеер, функция внутри подписки не может получить доступ к массиву игроков [] - она ​​не инициализирована.

Опять же, это работало в бета-версии, но не в RC.

Я что-то упустил?

Служба кэширования (упрощенный)

@Injectable() 
export class cacheService { 
    public players: any[]; 

    constructor(private _service: remoteService) { 
      this.players = []; 

      _service.players.subscribe((p: player) => { 
       if (this.players[p.id] && this.players[p.id].score) 
        p.score = this.players[p.id].score; 

       this.players[p.id] = p; 
      }); 
    } 
} 

Компонент (опять упрощенный)

@Component({ 
    selector: 'player-view', 
    templateUrl: '/Template/PlayerView' 
}) 
export class PlayerView implements OnInit { 
    public playerCache = any[]; 

    constructor(private _cacheService: cacheService) { 
     this.playerCache = []; 
    } 

    getDraftData() { 
      this._cacheService.getPlayers(league.id); 
      this.playerCache = this._cacheService.players; 
     } 
    } 

    ngOnInit() { 
     this.getDraftData(); 
    } 
} 

Изменить: исправлена ​​ошибка транскрипции.

+0

Трудно сказать по коду, который вы отправили. Как выглядит 'getPlayers()'? Какое точное сообщение об ошибке вы получаете? –

+0

Ошибка возникает при попытке получить доступ к свойству массива this.players [] (например, this.players [p.id] .score). Сообщение об ошибке «Невозможно прочитать оценку свойства неопределенного». –

+0

Проблема, очевидно, связана с вашими данными. Проверьте, действительно ли данные установлены в '_service.players.subscribe (...)' перед тем, как вы его получите. «Наблюдаемый» - асинхронный. Просто потому, что вы подписались на него, это не значит, что вы сразу получите значение. Значение может быть установлено в конце концов, но это определенно не сразу. –

ответ

0

Эта строка недействительна

this.playerCache = this._dataService.players; 

Упоминание обслуживание this._cacheService. Нет this._dataService. dataService (все еще разные - нет _) - это тип this._cacheService

+0

Вы правы, это была фактически ошибка транскрипции, когда я упрощал код. Я обновил фрагмент соответственно. –

0

Я нашел проблему. У меня была строка, которая обращалась к свойству массива игроков без проверки.

Например:

if (this.players[p.id]) 
    temp = this.players[p.id].score 

this.players[p.id].score = temp 

Проблема возникла, когда игроки [p.id] был uninstantiated.

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