绑定到angular2中的组件属性

Posted

技术标签:

【中文标题】绑定到angular2中的组件属性【英文标题】:Binding to a component property in angular2 【发布时间】:2015-07-11 12:48:26 【问题描述】:

我想引用 A 中组件的属性。该组件的构造函数 B.该组件的模板。这方面的 api 似乎有点变化,但我希望以下工作:

<my-component [greeting]="hello"></my-component>
// my component.es6.js
@Component(
  selector: 'my-component',
  properties: 
   'greeting': 'greeting'
  
)
@View(
  template: 'greeting world!'
)
class App 
  constructor() 
    console.log(this.properties) // just a guess
  

Plunkr

我做错了什么?

【问题讨论】:

我不确定当前版本的 Angular 是否可行。我四处看看angular2_material 是如何处理它的,但是当我尝试这些技术时,它要么什么也没做,要么它们使用了我的 angular2 中没有的功能(刚才从 npm 中提取)。 (1) [md-button][href] 是我发现的一个简单示例,它只期望 tabIndex(使用 hostProperties,而不是 properties)将绑定到对象,但在我的代码中,它永远不会。 (2) md-radio-button 使用@Attribute,TypeScript 不会为我编译(angular2/angular2 没有导出的memember 'Attribute')。 @Langdon 很有趣,感谢您的调查!现在情况似乎有些不稳定,这是意料之中的。 【参考方案1】:

我正在尝试使用 Angular2 并遇到了同样的问题。 但是,我发现以下内容适用于当前的 alpha 版本 (2.0.0-alpha.21)

@Component(
  selector: 'hello',
  properties: 'name':'name'
)
@View(
  template:`<h1>Hello _name</h1>`
)
class Hello 
  _name: string;

  constructor()  
    console.log(this);
  ;

  set name(name)
    this._name = name;
  


@Component(
  selector: 'app',
)
@View(
  template:
  `
    <div>
      <hello name="Matt"></hello>
    </div>
  `,
  directives: [Hello]
)
class Application 
  constructor()  ;


bootstrap(Application);

似乎传递给bootstrap 的类的属性被忽略了。不确定这是有意的还是错误的。

编辑:我刚刚从源代码构建了 Angular2 并尝试了 @Attribute 注释,它按照文档工作(但仅在嵌套组件上)。

constructor(@Attribute('name') name:string)  
    console.log(name);
;

将“Matt”打印到控制台。

【讨论】:

新人:请参考@N1mr0d的回答【参考方案2】:

其实,你可以做得更好。当您在组件中定义属性时,您始终以下列方式指定它:

howYouReadInClass:howYouDefineInhtml

所以,你也可以这样做:

@Component(
  selector: 'my-component',
  properties: 
   'greetingJS:greetingHTML'
  
)
@View(
  template: 'greeting world!'
)
class App 
set greetingJS(value)
this.greeting = value;

  constructor() 

  

这样您就不会在 TS 中发生冲突,并且您将拥有更清晰的代码 - 您将能够像在子组件中定义变量一样定义变量。

【讨论】:

【参考方案3】:

目前的方式是将属性装饰成@Input。

@Component(
    `enter code here`selector: 'bank-account',
    template: `
    Bank Name: bankName
    Account Id: id
    `
)
class BankAccount 
    @Input() bankName: string;
    @Input('account-id') id: string;
    // this property is not bound, and won't be automatically updated by Angular
    normalizedBankName: string;

@Component(
    selector: 'app',
    template: `
    <bank-account bank-name="RBC" account-id="4747"></bank-account>`,
    directives: [BankAccount]
)
class App 
bootstrap(App);

以上示例来自https://angular.io/docs/ts/latest/api/core/Input-var.html

【讨论】:

以上是关于绑定到angular2中的组件属性的主要内容,如果未能解决你的问题,请参考以下文章

Angular2 RC5:无法绑定到“属性 X”,因为它不是“子组件”的已知属性

Angular2 RC5:无法绑定到“属性 X”,因为它不是“子组件”的已知属性

Angular2绑定属性值

Angular2,TypeScript,如何读取/绑定属性值到组件类(在 ngOnInit 中未定义)[重复]

Angular2 - 组件变量/组件类属性的两种方式数据绑定?

Angular2 - 组件变量/组件类属性的两种方式数据绑定?