Angular 4并不关心Elvis操作员(?。)

时间:2017-10-30 17:04:48

标签: javascript angular ionic-framework

Elvis运营商(也称为安全导航运营商)应该避免在尝试访问" undefined" JavaScript对象中的方法,对吗?

好吧,也许不是,也许我做错了什么。检查此代码:

<ion-content padding>
  <h3>"{{place?.get("placeName")}}" management</h3>
  <ion-list>
    <ion-item *ngFor="let visit of visitBuffer">
      User: {{visit?.get("userId")}}
    </ion-item>
  </ion-list>
</ion-content>

(是的,它是一个Ionic app,运行Angular 4)。

所以我只想看到每个对象的userId&#34;访问&#34;对于每个项目。应该不是问题吧?我在两个不同的并行查询中加载了visitBuffer的所有信息,这些查询在构造函数中运行:

export class Management {

  place;
  visitBuffer = [];

  constructor(
    public navCtrl: NavController,
    public navParams: NavParams
  ) {
    const placeId = localStorage.getItem("placeId");
    this.getPlace(placeId)
        .then( place => {
          this.place = place;
          // Subscribe to normal Visits
          this.subscribeVisits(placeId).then( subscription => {
            let s = <any> subscription;
            s.on('create', (visit) => {
              this.visitBuffer.push(visit);
            });
          })
          // Subscribe to GroupVisits
          this.subscribeGroupVisits(placeId).then( subscription => {
            let s = <any> subscription;
            s.on('create', (visit) => {
              this.visitBuffer.push(visit);
            });
          })
        })
  }

您在那里看到的方法,只是查询Parse数据库并返回一些对象或数组。他们只是将对象推入&#34; visitBuffer&#34;并将.map函数应用于数组,将其数据重新分配到同一个&#34; visitBuffer&#34;数组比以前。这是使用的,因此两个相似的对象(Visits和VisitGroups)在同一个数组中输入,因为我在我的视图中将与它们同等地工作。

我只是试图获得Parse方法&#34; .get(property)&#34;,所以我可以得到两种类型的对象都具有的属性usedId。我甚至使用了elvis运算符,但是......无论如何都会抛出错误:

VM1194 Management.ngfactory.js:13 ERROR TypeError: _v.context.$implicit.get is not a function
    at Object.eval [as updateRenderer] (VM174 Management.ngfactory.js:15)
    at Object.debugUpdateRenderer [as updateRenderer] (VM82 vendor.js:13488)
    at checkAndUpdateView (VM82 vendor.js:12632)
    at callViewAction (VM82 vendor.js:12995)
    at execEmbeddedViewsAction (VM82 vendor.js:12953)
    at checkAndUpdateView (VM82 vendor.js:12628)
    at callViewAction (VM82 vendor.js:12995)
    at execComponentViewsAction (VM82 vendor.js:12927)
    at checkAndUpdateView (VM82 vendor.js:12633)
    at callViewAction (VM82 vendor.js:12995)

我做错了什么......?当我使用elvis运算符时为什么视图会崩溃?

2 个答案:

答案 0 :(得分:1)

我过去遇到过类似的问题。查看*ngIf是否有帮助:

 <ion-list *ngIf="visitBuffer">
    <ion-item *ngFor="let visit of visitBuffer">
      User: {{visit.get("userId")}}
    </ion-item>
  </ion-list>

答案 1 :(得分:0)

好的,我解决了这个问题,尽管我刚刚意识到有关猫王操作员的一个有趣的事实。

我瞄准的变量(usedId),对于类型&#34; GroupVisit&#34;而言并不存在,所以当该类型的一个对象到达时,它就崩溃了。事实上,似乎elvis运算符似乎首先检查变量的类型,然后对来自数组的每个值应用相同的规则。

我认为elvis运算符会检查每个对象中的空值,但它只是在第一个看起来。我不得不对我如何填充&#34; visitBuffer&#34;进行一些修改。所以我不再解决这个问题了:我可以使用不同的数组,或者只是将属性添加到GroupVisit对象中。第二种选择很有效。

无论如何,对于像这样的情况,我们有一个动态类型的数组,我们应该有一些类型的&#34;循环elvis运算符&#34;检查循环的每次迭代中的空值,而不仅仅是第一个对象。