我正在使用ngOnInit来从回送API调用中获取响应。 我在此范围内初始化的属性不能在订阅范围之外使用。我知道这是一个简单的答案,但我只是看不到
private siteData: Kiosk;
constructor(private dataService: DataService){}
ngOnInit(){
this.dataService.getDataByID(this.dataService.getSiteID())
.subscribe((data:Site) => {
this.siteData = data;
console.log(this.siteData); // This outputs correctly
});
console.log(this.siteData); // This is undefined
}
site: any[] = [{
title: this.siteData.title, // this is undefined and throws error
}];
我希望输出不会是不确定的,并且是响应中的数据
答案 0 :(得分:1)
这是因为可观察对象是异步的。直到在subscribe
调用中进行分配后,sideData才定义-它类似于promise。
如果在调用.then
之前尝试访问Promise设置的值,那么它也将是未定义的。解决此问题的方法是使用tap
运算符将其设置在管道中,然后在订阅中以其他方式对其进行操作。另外,您可以使用类似ngrx这样的工具,该工具会自动将其更新为最新值。
答案 1 :(得分:1)
我还想指出您对Angular中的生命周期挂钩有更好的了解。您正在这样设置类属性:
site: any[] = [{
title: this.siteData.title, // this is undefined and throws error
}];
这意味着您正在访问this.sideData
,它仅在初始化(构造)组件后实际运行的ngOnInit挂钩中设置。此外,您仅在生命周期挂钩(OnInit)中订阅了Observable,即您仅在Observable发出结果之后才主动分配结果。您的可观察对象不一定必须是异步的,但就您而言,很可能是异步的。
短故事:由于尝试访问对象this.siteData
的属性(此时未定义),您会遇到错误。
答案 2 :(得分:0)
console.log(this.siteData); // This is undefined
因为如果您不希望this.dataService.getDataByID
处于不确定状态,它不会等待Error: EPERM: operation not permitted, mkdir 'C:\Users\Yasiru'
TypeError: Cannot read property 'loaded' of undefined
at exit (C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:98:27)
at errorHandler (C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:216:3)
at C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js:77:20
at cb (C:\Program Files\nodejs\node_modules\npm\lib\npm.js:225:22)
at C:\Program Files\nodejs\node_modules\npm\lib\npm.js:263:24
at C:\Program Files\nodejs\node_modules\npm\lib\config\core.js:83:7
at Array.forEach (<anonymous>)
at C:\Program Files\nodejs\node_modules\npm\lib\config\core.js:82:13
at f (C:\Program Files\nodejs\node_modules\npm\node_modules\once\once.js:25:25)
at afterExtras (C:\Program Files\nodejs\node_modules\npm\lib\config\core.js:173:20)
C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:98
var doExit = npm.config.loaded ? npm.config.get('_exit') : true
^
TypeError: Cannot read property 'loaded' of undefined
at exit (C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:98:27)
at process.errorHandler (C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:216:3)
at process.emit (events.js:196:13)
at process._fatalException (internal/process/execution.js:142:25)
Install for [ 'create@latest' ] failed with code 7
完成使用
答案 3 :(得分:0)
您将需要使用您已经在执行的值来初始化subscription方法中的变量。
现在,一旦请求完成,您就可以在HTML中访问它们。确保在HTML中添加检查,即如果siteData
使用*ngIf
,然后正常使用这些变量
答案 4 :(得分:0)
仅当您获得如下数据时才填写字段:
private siteData: Kiosk;
site: any[];
constructor(private dataService: DataService){}
ngOnInit(){
this.dataService.getDataByID(this.dataService.getSiteID())
.subscribe((data:Site) => {
this.siteData = data;
site = [{title: data.title}];
});
}