Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在《英雄之旅》中,这个订阅方法的内部发生了什么?_Javascript_Angular_Typescript_Subscribe - Fatal编程技术网

Javascript 在《英雄之旅》中,这个订阅方法的内部发生了什么?

Javascript 在《英雄之旅》中,这个订阅方法的内部发生了什么?,javascript,angular,typescript,subscribe,Javascript,Angular,Typescript,Subscribe,我无法解决此.subscribe方法中发生的问题 我一直认为这个.heroses=heroses被分配给herose:Hero[]在herose组件中。事实并非如此。如果我将heros:Hero[]更改为heros:boolean,或者即使我完全从heros组件中删除heros:Hero[],我的英雄仍然会显示。而这个,英雄仍然被分配 有人能解释一下这是怎么发生的吗 试着做我提到的事情并删除英雄:Hero[],然后注意英雄们仍然是如何显示的。如果this.heromes=heromes未分配给h

我无法解决此.subscribe方法中发生的问题

我一直认为这个.heroses=heroses被分配给herose:Hero[]在herose组件中。事实并非如此。如果我将heros:Hero[]更改为heros:boolean,或者即使我完全从heros组件中删除heros:Hero[],我的英雄仍然会显示。而这个,英雄仍然被分配

有人能解释一下这是怎么发生的吗

试着做我提到的事情并删除英雄:Hero[],然后注意英雄们仍然是如何显示的。如果this.heromes=heromes未分配给heromes:Hero[],那么订阅方法内部到底发生了什么?

如果删除heromes属性,则从服务获取数据时,它会自动在Javascript中创建一个属性并显示该属性。浏览器运行Javascript代码,因此没有错误。如果未声明属性或属性的数据类型不正确,则会出现TypeScript编译时错误

我一直认为这个.heroses=heroses被分配给herose:Hero[]在herose组件中

没错。 问题是,那些红色下划线的错误是打字脚本错误。如果TS编译器以某种方式绕过它们并构建项目,那么JavaScript在动态创建新对象属性方面没有问题

但是,生产构建应该失败。

此处this.heromes=heromes,其中this.heores是在顶部分配的空变量,用于保存从SubscriberHeromes获取的数据。如果未分配空变量,则在使用this.heores时将抛出错误。当您删除英雄时,将抛出类似于“HeroesComponent”类型上不存在“Property”heroes的错误:Hero[];它仍将显示,因为它都从TypeScript编译为JavaScript

为了在一个更简单的示例中轻松地将其可视化,它将非常类似于下面的内容,在不首先指定对象的情况下将其添加到对象中

var exampleObj={}; 例如obj.heroses=‘蝙蝠侠’;
console.logexampleObj;它将您从服务中获得的英雄分配到该类的英雄属性。heros:Hero[]是纯类型脚本,它在运行时不存在。JavaScript不关心您是否分配了任意属性,或者是否分配了正确的类型;这就是TypeScript存在的原因。在HeroesComponent中,this.heros代表英雄:HeroesComponent中的Hero[]。在getHeroes方法中,您从HeroService获取所有英雄,然后通过此将结果分配给组件的英雄列表。heroes=heroes.youri,是否可能此.heroes=heroes未分配给英雄组件的英雄列表,而是将自己分配给heroes的方法参数,然后在方法参数中显示它从hero.service检索到的可观察对象?@jornsharpe,如果它将被简单地溢出,这不是违背了TypeScript的目的吗?我不明白为什么在这个例子中它是超限的,但在其他许多例子中,如果所有类型都不匹配,typescript将不允许我编译。我正在删除Hero:Hero[]和VS代码,它仍然在编译,这怎么可能?如果我将英雄分配给像这样的布尔值heroes:boolean,代码仍然编译并显示我的英雄列表。是否可能.subscribe方法没有分配给Hero:Hero[],而是将自身分配给该方法的参数?在本例中,heroes=>this.heroes=heroes正在从hero.service分配给函数内的参数,并且完全忽略了'heroes:hero[]`不。首先,观测者是一个箭头函数,它没有自己的this,它使用词法this,因此它是HeroesComponent。第二,视图仍然显示英雄列表,不是吗?它从HeroesComponent.heroes属性中获取英雄。如果将英雄组件中的英雄:英雄[]更改为英雄:布尔值,为什么仍会分配此.heroes=英雄?您可以在stackblitz的实时示例中尝试它,它仍然有效。“这怎么可能?”问和答。我正在用VS代码删除Hero:Hero[],它仍在编译,这怎么可能?如果我将英雄分配给像这样的布尔值heroes:boolean,代码仍然编译并显示我的英雄列表。是否可能.subscribe方法没有分配给Hero:Hero[],而是将自身分配给该方法的参数?在本例中,heroes=>this.heroes=heroes从hero.service分配给函数内的参数,并完全忽略'heroes:hero[]`是否在VS代码中安装TSLint扩展,您将看到红色下划线。尝试通过ng build-prod构建应用程序,您将得到错误消息。在浏览器中,javescript代码被执行,所以对于javascipt来说没有任何错误,这些都不是
起诉。请阅读javascript和typescriptAdrita之间的差异,是否有可能this.heromes=heromes没有从heromes组件分配给heromes列表,而是将自己分配给heromes的方法参数,然后在方法参数中显示从herome.service检索到的可观测值?如果是这样的话,就不需要英雄:英雄组件中的英雄[]。不@Ne0,这里不会发生这种情况
 getHeroes(): void {
    this.heroService.getHeroes()
        .subscribe(heroes => this.heroes = heroes);
  }