(В этом ответе предполагается, что вы привязываетесь к HTMLElement
, а не к объекту модели в приложении. Учитывая, что [attr.{name}]
-синтаксис поддерживается только для объектов DOM HTMLElement
, это предположение должно stand)
При работе с DOM интерфейсы DOM для определенных элементов определяют первоклассные / собственные свойства (как в JavaScript properties ) для определенных атрибутов HTML.
Например, интерфейс DOM HTMLElement
определяет первоклассное свойство id
, поэтому вы можете напрямую использовать его в выражении привязки: [id]
. Точно так же HTMLAnchorElement
предоставляет свойство href
.
(отмечу, что contenteditable
- это определенное свойство интерфейса DOM в WHATWG HTML LS, но не спецификации DOM W3 C, интересно ...)
Однако произвольные (ультрасовременные, определяемые пользователем и устаревшие) атрибуты HTML не предоставляются через интерфейсы DOM и т. д. Доступ к нему возможен только через коллекцию attributes
в DOM. Angular требует, чтобы вы использовали [attr.{name}]
для атрибутов, отличных от свойств DOM, чтобы он знал, что должен использовать коллекцию attributes
вместо того, чтобы предполагать, что он может связываться непосредственно со свойством DOM.
Чтобы ответить Ваш вопрос более прямо:
при использовании [name] vs [attr.name]?
Следуйте этой блок-схеме:
- Является ли значение, которое я выставляю, как свойство интерфейса DOM?
- Да:
- Использование
[propertyName]
- Нет:
- Является ли значение после атрибута HTML без соответствующего свойства интерфейса DOM?
- Да: используйте
[attr.{attributeName}]
- Нет: оставьте свою работу и позвольте кому-нибудь еще справиться с эмоциональными и психическими стрессами быстро развивающейся экосистемы JavaScript разработчика.