内部财产数据绑定问题

时间:2019-02-22 09:18:25

标签: angular

将数据呈现到来自api的模板上时,我注意到如果数据位于嵌套对象/数组中,则必须使用问号。

即:

approveBooking?.cabBooking?.bookingId

而不只是:

approveBooking.cabBooking.bookingId

这是解决此问题的正确方法吗?使用打字稿接口是否可以避免使用“?”因为您是在预先告诉应用程序什么嵌套对象/数组在其中?

4 个答案:

答案 0 :(得分:1)

实际上是为什么?用来保留仅在可用时显示的数据。

让我们以您正在从api请求中从JSON对象中提取此数据为例,而不使用?加载变量时会显示错误,因为页面会立即加载并在api服务延迟时将值呈现为Null,但是“?”运算符允许数据在显示之前可用。

那么,您的情况

approveBooking?.cabBooking?.bookingId 

这告诉应用程序

  1. 在cabBooking对象可用时显示bookingId属性,并且
  2. 在approveBooking对象可用时加载cabBooking属性。

我希望这能回答。

答案 1 :(得分:1)

  

Angular安全导航运算符(?。)是一种流畅而便捷的方法,可防止属性路径中的null和undefined值

Angular中的

?是安全的导航运算符,它只是避免了模板数据绑定中的虚假和空值检查。

当然,您可以对打字稿接口进行相同的操作,但这是检查脆弱和空值检查的快捷方式。

答案 2 :(得分:1)

  

有两种安全导航方式-

1)使用?,就像您已经做过的事情-

approveBooking?.cabBooking?.bookingId

2)使用['']:您还可以将安全遍历用作-

approveBooking['cabBooking']['bookingId']


为什么要使用安全导航? 它用于避免顺序的显式null检查和赋值,并将其替换为方法/属性链。在将导航运算符(例如“。”)应用于空对象时导致错误的编程语言中,安全的导航运算符停止对方法/字段链的求值并返回null作为链表达式的值。有关更多信息,请参考 this

答案 3 :(得分:1)

”?作为三元运算符。仅适用于角度模板引擎,不是打字稿或javascript功能。

例如:假设在您的api调用中,响应对象具有几个字段,这些字段并不总是存在,我的意思是每当您调用该API时。

第一种情况:

response = {
    uname: 'xyz',
    country: {
        iso: 'IN',
        name: 'India',
        ...
    },
    ssn: 2839483
}

第二种情况:

response = {
    uname: 'abc',
    ssn: 8765678
}

您要在模板中使用条件*ngIf通过iso值检查是否来自特定国家/地区的用户,以便您可以为其显示一个标志。

现在,对于第一种情况,当您使用此response.country.iso时,它将在控制台中显示错误,提示找不到未定义的iso。为了在动态模板中安全地处理此问题,您需要编写response.country?.iso

请注意,我仅对国家/地区字段使用'?'运算符,因为我知道此字段仅在我的API响应数据中是变量。