2017-08-30 29 views
6

我正在研究一个Angular项目(Angular 4.0.0),并且我无法将抽象类的属性绑定到ngModel,因为我首先需要将它转换为具体它实际上是为了访问该属性的类。Angular 2中的模板中的类型投射

即我有一个AbstractEvent类,它有一个具体的实现事件,它有一个布尔属性'确认',我需要通过ngModel的双向绑定来设置复选框。

目前,我有我的DOM这个元素:

<input type="checkbox" *ngIf="event.end" [(ngModel)]="(event as Event).acknowledged" 
              [disabled]="(event as Event).acknowledged"> 

不幸的是,这是引发以下错误:

Uncaught Error: Template parse errors: Parser Error: Missing expected) at column 8 in [(event as Event).acknowledged]

周围的Googling似乎暗示这可能是因为使用“为”不支持在模板内使用它吗?虽然我不确定这一点。

我也无法解决如何在驱动模板的打字稿文件中为它写一个函数,因为这会破坏我需要的ngModel上的双向绑定。

如果任何人有任何方法来解决这个问题或正确地在角模板中执行类型转换,我会非常感激!

回答

7

这是不可能的,因为Event不能从模板内引用。

as也没有模板绑定表达式支持) 你需要使它可先:

class MyComponent { 
    EventType = Event; 

那么这应该工作

[(ngModel)]="(event as EventType).acknowledged" 

更新

class MyComponent { 
    asEvent(val) : Event { return val; } 

然后用它作为

[(ngModel)]="asEvent(event).acknowledged" 
+0

感谢的快速答复,但我似乎仍然得到同样的错误:“未捕获错误:模板解析错误: 分析器错误:缺少预期)在列8 [[事件为EventType] .acknowledged]“ – Plog

+0

我更新了我的答案。它可能会对性能产生显着影响,因为在模板中绑定的函数经常被调用。如果没有必要,我会尽量避免使用它。你没有铸造错误吗? –

+2

非常感谢,让它工作。是的,我不太担心表演。目前正在研究由我的一位同事编写的一个原型项目。在未来,我可能会尝试避免这种需要铸造的设计。再次感谢。 – Plog