【问题标题】:Angular2 RC1 Service is losing initiated propertiesAngular2 RC1 服务正在丢失启动的属性
【发布时间】: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 是异步的。仅仅因为您订阅了它并不意味着您会立即获得价值。该值最终可能会设置,但绝对不会立即设置。
  • 感谢您的提问,我实际上找到了问题(请参阅答案)。在各种检查之外有一行代码访问播放器数组。它看起来就像数组根本没有初始化一样。

标签: angular angular2-services


【解决方案1】:

此行无效

this.playerCache = this._dataService.players;

服务参考是this._cacheService。没有this._dataService。 dataService(仍然不同 - 没有 _)是 this._cacheService 的类型

【讨论】:

  • 你是对的,这实际上是我在简化代码时出现的转录错误。我已经相应地更新了 sn-p。
【解决方案2】:

我发现了问题。我有一行未经检查就访问了播放器数组的属性。

例如:

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

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

当玩家 [p.id] 未被实例化时,问题就出现了。

【讨论】:

    猜你喜欢
    • 2014-04-23
    • 2013-04-26
    • 1970-01-01
    • 2014-09-01
    • 2021-12-19
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多