direct binding to a property of property in Angular
我有一个这样的模型:
1 2 3 | export class Person{ name: string; } |
在我的组件中使用的方式如下:
1 2 3 4 5 | export class TestComponent { @Input() person : Person; constructor() { } } |
我想从html设置人名,如下所示:
1 |
当我这样做时,angular会生气:"无法绑定到'person.name',因为它不是'app-test'的已知属性。"
好吧,他以某种方式正确,person是我组件的财产,而不是person.name
另一方面,在以下示例中没有任何错误:
1 | <span [style.color]="'red'">This span is red.</span> |
我违反规则了吗?
还是样式属性在内部不同?怎么样?
谢谢
您不能绑定到person.name,因为Input()装饰器绑定到子组件(测试)中的person,而不是任何特定的属性,如person.name
您必须发送一个对象来解决此问题。
请参阅此示例。
这是因为您尝试传递给测试组件的Input属性是" person.name",这在测试组件上未定义。您的测试组件需要一个名为" person"的东西。其次,您传递的是字符串,而不是您在测试组件上定义的Person类型。更改Test组件以接受字符串或传递Person并在Test组件中引用name属性。并确保名称匹配。
这里有两种方法可以考虑将人的名字传递给其他部分
然后在测试组件中:
1 2 3 4 | export class TestComponent { @Input() name: string; @Input() person : Person; } |
请注意名称和类型如何匹配?我的建议是不要超过您的需要。如果只需要传递人名,则让您的组件接受一个字符串。无需传递整个对象。
TestComponent模板:
1 2 | Person: {{person.name}} Name: {{name}} |
我将添加一个到Angular文档的链接,因为我认为它是Angular中非常重要的部分,您可能需要查看。他们拥有的英雄教程非常好。
https://angular.io/api/core/Input
您是正确的[ngStyle]和[style]不同,您需要
1 |
其他选项是
1 |
在您的main.app
中
1 | this.person.name='Jack' |
请记住,如果在输入中使用对象,则父对象或子对象中对象属性的任何更改都将更改对象的"属性"
这是因为
您可以通过执行一些指令来实现此目的。我想你可以做类似的事情:
(未测试)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import { Directive, ViewContainerRef, ChangeDetectorRef, OnInit } from '@angular/core'; const selector = ` [name], [name.foo], [name.bar] `; export const inputs = [ 'name', 'name.foo', 'name.bar' ]; @Directive({ selector, inputs }) export class HelloDirective implements OnInit { constructor( private viewContainerRef: ViewContainerRef ) { } ngOnInit(): void { const getSetKeys = Object.keys(this).filter(item => inputs.indexOf(item) > -1); const getValues = getSetKeys.map(item => this[item]); const component = this.viewContainerRef['_view'].component; getSetKeys.forEach((item, index) => { const splitKey = item.split('.'); component[splitKey[0]][splitKey[1]] = getValues[index]; }) } } |
在这种情况下,您可以将指令用作
我不推荐这种方式,但是可以实现。