我有一个类型为@Input
的{{1}}属性的组件:
Foo
在@Component({
...
})
export class MyComponent {
@Input() Options: Foo;
...
}
文字类中,将其作为输入值传递给它:
ParentComponent.html
然后<My [Options]="{prop1:true, prop2:false, prop3:1, ... }"></My>
的类型不再是Options
。它更改为匿名对象,因此Foo
的方法不再可用。
防止这种情况的一种方法是在Foo
中创建Foo
的实例并将其作为变量传递:
ParentComponent .ts
在@Component({
...
})
export class ParentComponent {
Options: new Foo(true, true, 1, ...);
...
}
中使用:
ParentComponent.html
另一种方法是将匿名对象投射到新创建的<My [Foo]="options"></My>
对象上:
Foo
@Component({
...
})
export class MyComponent {
@Input() set Options(value: Foo){
//Somehow cast anonymous to Foo.
}
private options : Foo;
...
}
?答案 0 :(得分:1)
如果要使用所描述的两种方法之一使用类方法,则有时需要使用Foo
创建类new
的实例。如果要将普通对象作为@Input
传递,则输入不能是{class-} type Foo
,因为它不是该类的实例。在该类中,您需要先调用new Foo(fooInput)
,然后再调用e。 G。将新创建的实例分配给另一个成员变量。
我认为,最好将数据放在普通数据对象中而不是类中:为了类型安全,将Foo
定义为interface
而不是class
。然后,将class
中的方法放入FooService
中,该方法操纵Foo
对象。这样,您就不必费心使用类实例化了。
class User {
constructor(public firstName: string, public lastName: string) {}
getFullName(): string {
return `${this.firstName} ${this.lastName}`;
}
}
成为:
interface User {
firstName: string;
lastName: string;
}
class UserService {
getFullName(user: User): string {
return `${user.firstName} ${user.lastName}`;
}
}