问题 在Angular 2中的模板中键入cast


我正在开发一个Angular项目(Angular 4.0.0),但我无法将抽象类的属性绑定到ngModel,因为我首先需要将它作为实际的具体类来转换为访问该属性。

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

我目前在我的DOM中有这个元素:

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

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

未捕获错误:模板解析错误:   在[(事件为事件)。第8列中的分析器错误:缺少预期)。已确认]

谷歌搜索似乎表明这可能是因为在模板中使用它时不支持使用'as'?虽然我不确定这一点。

我也无法弄清楚如何在驱动模板的typescript文件中为它编写一个函数,因为这会破坏我需要的ngModel上的双向绑定。

如果有人有办法解决这个问题或正确地在角度模板中进行类型转换,我将非常感激!


4482
2017-08-30 15:37


起源



答案:


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

as 模板绑定表达式也不支持) 你需要先让它可用:

class MyComponent {
  EventType = Event;

这应该工作

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


12
2017-08-30 15:40



感谢您的快速回复,但我似乎仍然收到相同的错误:“未捕获错误:模板解析错误:解析器错误:错过预期”在第8列[(事件为EventType).acknowledged]“ - Plog
我更新了我的答案。它可能会对性能产生显着影响,因为模板中绑定的函数经常被调用。如果没有必要,我会尽量避免使用它。没有铸造你会得到错误吗? - Günter Zöchbauer
非常感谢让它发挥作用。是的,我不太担心表现。目前正在研究我的一位同事撰写的一种原型项目。在未来,我可能会试图避免这种需要铸造的设计。再次感谢。 - Plog
欢迎你:)这个方法很简单,什么也不做(当TS被转换成JS时,将完全删除转换),但是在没有任何getter或方法的情况下直接检查属性时,更改检测是最有效的。只是在使用Angular时应该注意的事情。 - Günter Zöchbauer


答案:


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

as 模板绑定表达式也不支持) 你需要先让它可用:

class MyComponent {
  EventType = Event;

这应该工作

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


12
2017-08-30 15:40



感谢您的快速回复,但我似乎仍然收到相同的错误:“未捕获错误:模板解析错误:解析器错误:错过预期”在第8列[(事件为EventType).acknowledged]“ - Plog
我更新了我的答案。它可能会对性能产生显着影响,因为模板中绑定的函数经常被调用。如果没有必要,我会尽量避免使用它。没有铸造你会得到错误吗? - Günter Zöchbauer
非常感谢让它发挥作用。是的,我不太担心表现。目前正在研究我的一位同事撰写的一种原型项目。在未来,我可能会试图避免这种需要铸造的设计。再次感谢。 - Plog
欢迎你:)这个方法很简单,什么也不做(当TS被转换成JS时,将完全删除转换),但是在没有任何getter或方法的情况下直接检查属性时,更改检测是最有效的。只是在使用Angular时应该注意的事情。 - Günter Zöchbauer