如何在 html 元素属性中使用 Angular 2 外推法
How to use Angular 2 extrapolation in html element attributes?
我想将一些数据绑定到非自定义的html元素属性。但是,属性中的 {{ }} 不是外推的。我查看了其他相关帖子,例如"Angularjs templateUrl无法在ng-repeat中绑定属性",这是自定义指令的角度1解决方案。
例如,我有:
size = 500;
我希望以下 SVG 元素正常工作:
<svg xmlns="http://www.w3.org/2000/svg/" width="{{size}}" height="{{size}}">
<rect width="{{size}}" height="{{size}}" fill="#DCB35C"/>
</svg>
我应该如何在 Angular 2 中执行此操作?
简答
当 HTML 属性和 DOM 属性之间没有 1:1 映射时,必须使用属性绑定语法,否则 Angular 2 将报告"模板解析错误"。
例子:
-
[attr.my-custom-attribute]="myComponentValue"
-
[attr.colspan]="1 + 1"
在您的情况下,SVG 元素具有宽度和高度 DOM 属性,但它们不是您所期望的。它们是 SVGAnimatedLength 对象。试图以旧方式设置它们的值不会做任何事情。这就是您的模板无法按预期工作并且不报告错误的原因。切换到属性绑定语法将修复此行为:[attr.width]="width" [attr.height]="height"
深入解释
属性绑定在 Angular 1 和 Angular 2 中的工作方式在概念上有很大的区别。
在 Angular 1 中,设置自定义属性如下所示:
-
<div a-custom-attribute="I am a custom {{ 'attribute' }}">Text Content</div>
-
<div ng-attr-a-custom-attribute="I am a custom {{ 'attribute' }}">Text Content</div>
- 此语法允许您绑定到浏览器会急切处理的属性(例如,SVG 元素的 circle[cx] 属性、IMG 元素的 src 属性等)
在 Angular 2 中,有一个不同的故事:
正如他们所说,Angular 2引入了一种新的心智模型:它不是绑定到HTML属性,而是绑定到DOM属性。了解 HTML 属性和 DOM 属性之间的区别对于掌握 Angular 2 绑定的工作原理至关重要。
绑定到 DOM 属性可能如下所示:
-
<img [src]="heroImageUrl">
-
<img bind-src="heroImageUrl">
-
<img src="{{ heroImageUrl }}">
- 这可能看起来有点令人困惑,特别是如果有人有 AngularJS 1 背景,但 Angular 2 在渲染视图(源)之前将这些插值转换为相应的属性绑定。重要的是要记住,正如 Mark 在注释部分指出的那样,在评估插值后,其结果将转换为字符串(源)。这意味着此语法仅限于分配字符串值。
请注意,如果名称与 DOM 属性不匹配,Angular 2 会报告"未知本机属性"错误:
// Template parse errors:
// Can't bind to 'colspan' since it isn't a known native property
<tr><td colspan="{{1 + 1}}">Three-Four</td></tr>
// Template parse errors:
// Can't bind to 'madeUpProperty' since it isn't a known native property
<div [madeUpProperty]="My custom {{ 'madeUpProperty' }}"></div>
这意味着当没有要绑定到的 DOM 属性时,必须使用属性绑定语法。
最后,我认为作为一个好的经验法则,应该始终使用属性绑定的语法(例如 [src]="heroImageUrl"
)赞成插值(例如 src="{{heroImageUrl}}"
),每当他想修改元素的 DOM 属性时,因为后者仅限于传递字符串值。另一个原因是,如果有人有 AngularJS 1 背景,这应该可以减少设置属性和 DOM 属性之间的混淆。
<svg xmlns="http://www.w3.org/2000/svg/" [attr.width.px]="size" [attr.height.px]="size">
<rect [attr.width.px]="width" [attr.height.px]="height" fill="#DCB35C" />
</svg>
使用属性绑定来绑定width
和height
,在像[attr.*]
一样绑定之前attr
前缀。
标记
<svg xmlns="http://www.w3.org/2000/svg/" [attr.width]="size" [attr.height]="size">
<rect [attr.width]="width" [attr.height]="height" fill="#DCB35C" />
</svg>
类
import {Component} from 'angular2/core';
import {bootstrap} from 'angular2/platform/browser';
@Component({
selector: 'demo-app',
templateUrl: 'src/app.html',
pipes: []
})
export class App {
width: number = 100;
height: number=100;
size: number=100;
constructor() { }
}
bootstrap(App);
演示普伦克
尔根据请求通过具有一些常量字符串值来附加大小值,您只需将其放在attribute
上,例如[attr.width]="size + '5'"
<svg xmlns="http://www.w3.org/2000/svg/" [attr.width]="size" [attr.height]="size">
<rect [attr.width]="width + '5'" [attr.height]="height + '5'" fill="#DCB35C" />
</svg>
更新的普伦克尔
- 使用angular重定向到html页面
- 如何在html angular中显示嵌套的json元素
- 在Angular中重新使用HTML端的计算文本
- 使用Angular显示JSON中的HTML
- AngularJS:带有HTML和angular表达式的指令;编译”;具有外部范围的内容
- 重定向到Angular JS中的另一个HTML页面
- 使用Angular在HTML中呈现HTML实体字符串
- 选中的Angular HTML列表将所选值放入应用程序范围的变量和跨度中
- Angular html文件可以'找不到JS控制器[Node.JS/Angular]
- Angular & HTML / 检查元素是否脏
- Webpack 和 Angular HTML 图像加载
- OrderBy in Angular/html
- Angular - HTML中的IF /ELSE条件
- 我如何传递node.js服务器变量到我的angular/html视图
- 输入值没有显示在angular/html中
- MEAN stack angular html 标签注入不工作
- 不能在IE11中加载angular html模板
- AngularJS/Flash(如何在angular html中嵌入Flash视频部分)
- 特定元素上的Angular/HTML Glass窗格
- Angular html指令的执行