为什么 colspan 不是 Angular 2 中已知的原生属性?

新手上路,请多包涵

如果我们尝试这样的代码:

 <td [colspan]="1 + 1">Column</td>

或这个:

 <td colspan="{{1 + 1}}">Column</td>

我们很快就会发现“ colspan 不是已知的本地属性。”

从 A2 文档中我们了解到:

该元素没有 colspan 属性。它具有“colspan”属性,但插值和属性绑定只能设置属性,不能设置属性。

我们必须改为这样做:

 <td [attr.colspan]="1 + 1">Column</td>

这很公平。

问题:

我的问题是,为什么 colspan 不是 DOM 的属性,如果它丢失,浏览器怎么可能呈现表格,因为浏览器呈现 DOM 而不是 HTML?

另外,如果我打开 Chrome 检查器并转到属性选项卡,为什么我可以看到 colspan 作为元素的属性?

为什么 DOM 会出现这种不一致?

原文由 superluminary 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 385
2 个回答

**类似的例子 <label for=...>

财产和属性并不总是 1:1。一个经常遇到的例子是label标签

<label for="someId">

在角度

<label [for]="someId">

失败并出现相同的错误,您需要像这样绑定

<label attr.for="{{someId}}">

或者

<label [attr.for]="someId">

<label [htmlFor]="someId">

也会起作用,因为在这种情况下 htmlFor 是反映到 DOM 的属性 for 属性。另见 https://developer.mozilla.org/de/docs/Web/API/HTMLLabelElement htmlFor 属性(在 Properties 部分)

另请参阅 属性和特性之间有什么区别?

colSpan 实际财产名称

根据 https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableCellElement colSpan 是反映到 colspan 属性的属性(大写 S )

 <td [colSpan]="1 + 1">Column</td>

另见 https://plnkr.co/edit/BZelYOraELdprw5GMKPr?p=preview

工作得很好。

为什么 Angular 默认绑定属性

出于性能原因,Angular 默认绑定到该属性。绑定到属性是昂贵的,因为属性反映在 DOM 中,DOM 中的更改会导致重新评估更改后可能匹配的 CSS 样式,而属性只是 JavaScript 对象中已更改的值。

使用 attr. 您明确选择了昂贵的行为。

原文由 Günter Zöchbauer 发布,翻译遵循 CC BY-SA 3.0 许可协议

我的问题是,为什么 colspan 不是 DOM 的属性,如果缺少它,浏览器怎么可能呈现表格,因为浏览器呈现 DOM 而不是 HTML?

Colspan 是 DOM 的一个属性,但它不是属性,因此它是只读的,浏览器会呈现它,因为它是一个属性。

另外,如果我打开 Chrome 检查器并转到属性选项卡,为什么我可以看到 colspan 作为元素的属性?

当您检查镶边时,镶边会同时显示属性和属性。

如果您考虑关注,

 <html>
  <head>
  </head>
  <body>
  <table>
    <tr><th>A</th><th>A</th></tr>
    <tr><td colspan="2" id="xyz">B</td></tr>
  </table>
  </body>
</html>

document.getElementById('xyz').colspan 结果为 undefined 因为它不是一个属性

but document.getElementById('xyz').id 结果 xyz 因为它是一个属性

原文由 Low Flying Pelican 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题