2017-08-26 15 views
1

目前为止,我只能读取文档publicprivate作为TypeScript中的作用域。但是,当我尝试以下练习时,我会得到不同的结果,就好像变量environment对标记不可见,除非声明(公开或私下)。正在显示感觉在Angular中有第三个作用域(除了公共和私有),但不存在

<div class="text-section"> 
    Name is: {{environment.shazoo}}. 
</div> 
import { environment } from "../../../../environments/environment"; 
... 
@Component({ ... }) 
export class DemoComponent implements OnInit { 
    constructor(private builder: FormBuilder) { ... } 
    ... 
    private environment = environment; 
} 

在文本hazaa上面的例子的结果。但是,如果我注释将导入的环境实例分配给本地声明的行,则文本消失。

import { environment } from "../../../../environments/environment"; 
... 
@Component({ ... }) 
export class DemoComponent implements OnInit { 
    constructor(private builder: FormBuilder) { ... } 
    ... 
    // private environment = environment; 
} 

我图的方式,如果进口实例是在代码中可见,但不标记,还有第三级的范围界定,不管这可能是(某种secludedly私人啄的)。但我几乎认为事实并非如此。我错过了什么?

+0

Angular对此很奇怪 - 私有变量通常在它们自己的组件的模板中不可用,但一些编译器允许它 - https://stackoverflow.com/questions/34574167/angular2-should-private-variables-be在模板中可以访问的AOT编译失败,但是我只是在plunkr上测试,而且plunkr可以引用模板中的私有变量就好了 – diopside

+0

所以我认为在很多情况下,即使你的第一个例子也不会成功。但一般来说,模板必须在组件中有一些东西来为任何变量提供上下文。它并没有真正意识到它自己的类(组件)以外的任何typecript语句。 – diopside

+0

转储类版本只是一个没有私人访问修饰符=>纯javascript的函数。在您的视图模板中,您可以绑定此字段并使用它。 – glenn

回答

3

看起来你很迷惑TypeScript可见性与JavaScript上下文和变量作用域。

privatepublicaccess modifiers并影响仅在编译阶段类型检查和是可选的(除了当它们被用作构造器,在那里它们被还隐含地指定一个参数作为类属性的情况下)。

private environment = ...背后的含义是this.environment = ...发生在引擎盖下的构造函数中。您可以在transpiled代码检查

export class DemoComponent implements OnInit { 
    ... 
    environment = environment; 
} 

结果this.environment = environmentpublic访问修饰符是可选在这里)。

在另一个地方(编译后的模板)中,不可能使用导入的environment变量(对于导入它的组件模块是本地的),除非它被提供给应该使用它的地方(模板编译器),例如通过将它分配给可以访问(类属性)的东西。 JavaScript是如何工作的,并且不是特定于Angular或TypeScript的。

{{environment}}确实表示environment属性正在从组件类实例中读取。由于模板语法是由角编译器定义DSL,this可以有,但有人可选为简洁:

{{environment === this.environment}} is true 

最后,在模板中使用的所有组件属性应该是公共的,即不应该有privateprotected访问修饰符。这是Angular AoT编译所必需的。

+0

是什么导致我提出的疑问是,当我**没有声明变量'private environment'(虽然我有导入语句)时,我可以从它的方法中分配值(即'foo(){let x = environment.poof;}'工作)。那是怎么回事?!似乎只有模板中的访问被阻止。 –

+0

第二次后续行动 - 看起来,当我服务我的代码(即* ng serve *)时,我得到一切工作**但是**一旦我建立它(即* ng build *),转译器关于隐私的呻吟迫使我公开重新声明模板中使用的所有字段。这两者之间的差异让我感到不安。 –

+0

'environment'是*局部变量*。你指的是一个变量,而不是类属性('this.environment')。您可以在组件类中访问它,因为它是在定义类的模块范围内导入的。 Re:'build',这正是AoT最后一段提到的内容。使用公共领域的模板道具。 – estus