【问题标题】:Angular safe navigation operator in property binding属性绑定中的角度安全导航运算符
【发布时间】:2017-11-12 17:02:35
【问题描述】:

为什么 Angular(4) 中的安全导航运算符不能与属性绑定一起使用?以下html代码会产生错误(因为它会尝试GEThttp://localhost:4200/null

    <img [src]="(image | async)?.url" />

但是当我将其更改为以下表达式时,一切正常。

    <img src="{{(image | async)?.url}}" />

【问题讨论】:

  • 这两个摘录有什么区别?它们在我看来是一样的
  • 修复了,谢谢

标签: html angular


【解决方案1】:

1) 属性绑定

<img [src]="(image | async)?.url" />

产生赋值:

img.src = null;

2) 插值

<img src="{{(image | async)?.url}}" />

我称之为字符串化属性绑定

我们可以预期结果img.src = 'null';,因为null在转换为字符串后是'null',但要字符串化角度执行以下代码:

'' + _toStringWithNull(null) + ''
                       ^^^^
                    value from Pipe

_toStringWithNull 函数如下所示:

function _toStringWithNull(v) {
    return v != null ? v.toString() : '';
}

所以结果将是:

img.src = '';

3) 属性绑定

如果值为null,Angular 将不会添加属性


现在只需打开带有空 img 标记的 chrome 开发工具并尝试更改其 src 属性

$0.src = null

然后

$0.src = ''

这是我对上述所有案例的看法:

【讨论】:

    【解决方案2】:

    image 值可用之前,它实际上是null{{}} 用于字符串插值,就像添加src="null"

    只有当异步调用(Promise,Observable)返回值时,它才会从null变为实际值。

    改用属性绑定

    <img [attr.src]="(image | async)?.url" />
    

    这样src属性只会在值为!= null时添加,因此浏览器不会尝试从url'null'获取

    【讨论】:

    • 请看一下我编辑的问题,这是给我带来问题的属性绑定和实际有效的文本插值
    • 你可以试试我更新的答案。我不知道为什么src 属性会这样处理null
    • 这确实有效,知道有什么区别以及为什么不会产生错误吗?
    • 不同之处在于 '[src]="..."` 是传递原始值的属性绑定。 src="{{...}}" 是传递字符串化值的属性绑定,[attr.src]="..." 是始终将值字符串化的属性绑定,但 null 导致 Angular 删除属性并仅在值变为 != null 时添加它(因为我最初错误地声明用于属性绑定)。
    猜你喜欢
    • 2022-09-27
    • 2017-03-07
    • 2012-03-13
    • 2016-04-07
    • 2011-05-05
    • 2016-04-08
    • 1970-01-01
    • 2017-05-27
    • 2017-12-22
    相关资源
    最近更新 更多