【发布时间】:2016-09-02 16:07:15
【问题描述】:
我正在开发一个 Angular2 应用程序,并且在 RC1 出现之前它运行良好(尽管它从未在 RC0 中测试过)。
基本上,我有一个 cacheService 类,它订阅了“remoteService”类上的主题。任何组件都引用 cacheService.players 而不是向 remoteService 发出请求。我这样做是因为它还将应用程序缓存层与 remoteService 分离,允许 cacheService 进行缓存,并允许 remoteService 访问远程服务。
但是,当组件实例化时,会调用cacheService构造函数,它会初始化players[]数组。
但是,当 remoteService 发出一个播放器时,订阅中的函数无法访问 player[] 数组 - 它未初始化。
同样,这在 Beta 中有效,但在 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();
}
}
编辑:更正了转录错误。
【问题讨论】:
-
很难从您发布的代码中分辨出来。
getPlayers()长什么样子?您收到的确切错误消息是什么? -
在尝试访问 this.players[] 数组的属性(例如,this.players[p.id].score)时,实际上会发生错误。错误消息是“无法读取未定义的属性分数”。
-
问题显然出在您的数据上。在访问之前检查数据是否实际设置在
_service.players.subscribe(...)中。Observable是异步的。仅仅因为您订阅了它并不意味着您会立即获得价值。该值最终可能会设置,但绝对不会立即设置。 -
感谢您的提问,我实际上找到了问题(请参阅答案)。在各种检查之外有一行代码访问播放器数组。它看起来就像数组根本没有初始化一样。