【问题标题】:what are the normalization rules for properties in Angular 2+?Angular 2+ 中属性的规范化规则是什么?
【发布时间】:2019-07-07 18:53:24
【问题描述】:

我最近遇到了一个使用title 属性绑定该组件的title 的组件的愚蠢问题。 我忘记了 title 是一个已知的 HTML 属性,我的用户开始在其组件上看到带有标题的工具提示。

起初,我只是将属性名称更改为不冲突。但后来我想起在AngularJS中,有rules about normalization for directives

我搜索(使用搜索功能)Angular 6+ 文档,但在其中找不到 normalization 这个词。 我也进行了测试,似乎有一些标准化可用,至少使用data-

我的问题是: Angular 6+ 正式支持规范化吗?我在哪里可以找到它的文档?

我创建了一个StackBlitz,其中包含以下关键组件,以强调使用data-name="bob" 显然等同于name="bob"

import { Component, Input } from '@angular/core';

@Component({
  selector: 'hello',
  template: `<h1>Hello {{title}}!</h1>`,
  styles: [`h1 { font-family: Lato; }`]
})
export class HelloComponent  {
  @Input() title: string;
}
<hello data-title="bob"></hello>
<hello title="bob"></hello>

【问题讨论】:

  • 我不确定this issuethis article 是否部分回答了您的问题。
  • @ConnorsFan 是的,最后,我最终为我的属性指定了一个不冲突的名称。我的问题更具体地是关于 Angular 2+ 中发生了什么规范化

标签: angular angular2-directives angular-directive


【解决方案1】:

如果您使用的指令的输入可能与父元素的属性冲突,您有 3 个选项。

  1. 将指令的输入更改为不冲突的名称。
  2. 使用绑定符号

    <button title="PushMe" titleTesting [title]="'dont push me'">Push this</button>
    
  3. 使用属性表示法。

    <button [attr.title]="'PushMe'" titleTesting title="dont push me">Push this</button>
    

上述模板中使用的指令代码:

@Directive({
  selector: '[titleTesting]'
})
export class TitleTestDirective implements OnInit {
  @Input() title: string;
  ngOnInit(){
    console.log(this.title);
  }
}

最后,如果值应该相同并且是模板中定义的常量,则正常进行,因为元素和指令将获得相同的值,例如:

<button titleTesting title="dont push me">Push this</button>

另请参阅 Binding syntax: An overviewProperty binding or interpolation?attribute bindingstackblitz


标准化

简而言之,angular 不支持规范化,也不做任何事情。您列出了指令但有一个组件示例,组件不会有任何冲突的属性/输入,这就是我选择使用指令对示例建模的原因。

data- 是一个 HTML5 结构。 angular 不直接对此做任何事情。如果您确实包含data-,尽管它仍会按预期绑定到 Input,但不会在任何 html 特定属性上设置。示例:data-title="some title"。基于data- documentation,这是预期的行为。

您可以为不同的值提供相同类型的data- 和非data- 元素,但它们出现的顺序很重要。示例:

<button titleTesting title="Push me" data-title="DOn't push me">Push this</button>

【讨论】:

  • 感谢您的评论,但这不是我问题的核心(我非常了解语法)。此外,使用 [name]="'bob'" 是 4 个额外字符,不会带来任何价值。 name="bob" 是绑定静态数据的正确语法。
  • 非常感谢您的宝贵时间,但您在这里错过了我的问题的重点。我知道我已经在做的 100 种其他方法。我的具体问题是关于规范化。正如我的示例所示,它正在发生,如果您将data- 添加到您的属性中,它会起作用。但我找不到有关此的文档。我还要澄清一下,我使用的是 component 而不是 directive(我认为这个例子就足够了)。
  • 感谢您的澄清。我猜你是对的。令我惊讶的是,在 AngularJS 中有一个完整的指令文档部分专门解释正在发生的事情,而 Angular 2+ 似乎根本没有提到这一点。所以,答案是:浏览器会这样做,而不是 Angular?是所有的浏览器吗?只是想知道以供将来参考...
  • @EricLiprandi - 简而言之,angular 不支持规范化,也不做任何事情。您列出了指令,但有一个组件示例,组件不会有任何冲突的属性/输入,这就是我选择使用指令对示例进行建模的原因。
  • @EricLiprandi - data- 是一个 html5 结构。另见w3schools.com/tags/att_global_data.aspangular 不直接对此做任何事情。如果您确实包含data-,尽管它仍会按预期绑定到Input,但不会在任何html特定属性上设置。示例:data-title="some title"。根据data- 文档,这是预期行为。
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2011-08-21
  • 2013-06-12
  • 2019-12-22
相关资源
最近更新 更多