首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >私有成员可以在角2装饰器中访问。

私有成员可以在角2装饰器中访问。
EN

Stack Overflow用户
提问于 2016-07-19 20:47:56
回答 3查看 939关注 0票数 2

请考虑以下代码:

代码语言:javascript
复制
export class Hero {
    constructor(private id: number, private name: string) {}
}

@Component({
    selector: 'my-app',
    template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>'
})
export class AppComponent {
    private title = "Tour of Heroes";
    private hero: Hero = new Hero(1, "Windstorm");
}

然而,在AppComponent的模板中,我编写了hero.name,但是根据Hero类,这个字段是私有的,不应该被访问。这段代码是如何编译和工作的?我是不是遗漏了什么?

编辑:阅读了关于为什么会发生这种情况的答案,这是我的处理方法,它不是一个修复,但它保持了更有组织和安全的,而且访问器总是很适合使用:

代码语言:javascript
复制
export class Hero {
    constructor(private _id: number, private _name: string) { }

    get name(): string {
        return this._name;
    }

    get id(): number {
        return this._id;
    }
}

@Component({
    selector: 'my-app',
    template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>'
})
export class AppComponent {
    private title = "Tour of Heroes";
    private hero: Hero = new Hero(1, "Windstorm");
}

hero.name在JS中执行时,它应该调用您在TS代码中定义的JS编译的getter函数,这将在保持TS代码风格的同时对属性提供某种控制。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-19 20:51:09

在JavaScript中,没有私有变量这样的东西。像private这样的关键字只是被TypeScript转换程序使用来强制执行转换溢出之前的约束。一旦代码被转换到JavasScript中,name属性就是Hero类的可见成员。

票数 3
EN

Stack Overflow用户

发布于 2016-07-19 20:51:56

类型记录中的private关键字仅用于编译时检查,实际上并不限制运行时对任何内容的访问。类型记录编译器没有检查模板,所以没有发现问题。

我相信一些IDE (VS代码和WebStorm)正在对模板进行类型检查,但目前您是自己开发的。

票数 1
EN

Stack Overflow用户

发布于 2017-03-23 07:56:32

Angular2声明引用模板中的私有变量作为一种正确的方法。见备忘单:https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-setter

那就去吧!并启用对组件的封装,而不是将每个变量公开为公共变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38468227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档