2017-10-30 7 views
2

JavaScriptオブジェクトの "未定義"メソッドにアクセスしようとすると、Elvis演算子(セーフナビゲーション演算子とも呼ばれます)がページをクラッシュさせないようになっています。アンビエント4はElvis演算子(?)を気にしません

まあ、多分私は何か間違っています。このコードを確認してください:

<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> 

(はい、これは角度4を実行する)です。

だから、各アイテムの「訪問」という各オブジェクトのuserIdを確認するだけです。問題ではありませんか?ちょうど解析データベースに照会し、いくつかのオブジェクトや配列を返す、

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); 
      }); 
      }) 
     }) 
    } 

あなたがそこに見る方法:私は2つの異なる、並列クエリでvisitBufferのすべての情報をロードし、コンストラクタでその実行。彼らはオブジェクトを "visitBuffer"にプッシュし、配列に.map関数を適用するだけで、以前のものと同じ "visitBuffer"配列にデータを再配置します。これは、2つの類似したオブジェクト(VisitsとVisitGroups)が同じ配列に入力されるように使用されます。私はそれらを同じ視点で扱うためです。

私はParseメソッド ".get(property)"を取得しようとしているので、オブジェクトの両方の型が持っているプロパティusedIdを取得できます。私はエルヴィスの演算子を使っていますが...とにかくエラーを投げます:

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演算子を使用しているとビューがクラッシュするのですか?

+0

実際に 'place 'とは何ですか?このエラーは、 'place'のための' get'メソッドが存在しないことをさらに指しています。 'place'は"単なる変数 "なので正しいでしょう。 – Alex

+0

@ AJT_82 placeオブジェクトで失敗は起こっていませんが、visitBufferオブジェクトを使用しています – Zerok

+0

さて、 'visit'は何ですか?それは "あまりにも変わった"と思われますか? – Alex

答えて

1

私は過去に同様の問題に遭遇しました。 *ngIf場合に役立ちます参照してください:私はちょうどエルビス演算子について、実現興味深い事実があるが

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

これは奇妙に聞こえるかもしれませんが、... ngIfでも失敗しています。私のvisitBufferが[]に初期化されているからでしょうか? – Zerok

+0

本当にあなたがイオンリストを隠そうとしていない限り、実際にはngIfは必要ありません。 ngForは項目があるとループします。空リストの場合は、何も表示されません。 @Zerok、これをチェックする最も速い方法は!! []を実行して出力を記録することです。これは本当に出力されますので、実際は初期化のためです –

0

[OK]を、私は、問題を修正しました。

私が(usedId)を目指していた変数は、 "GroupVisit"型には存在しなかったので、その型のオブジェクトが1つ到着したときにクラッシュしました。それは、elvis演算子が最初に変数の型をチェックしてから、配列から来るすべての値に対して同じ規則を適用するように思えます。

私はelvis演算子がすべてのオブジェクトのnull値をチェックすると思っていましたが、最初のように見えます。私は "visitBuffer"をどのように設定するかでいくつかの変更を加えなければならなかったので、私はもうこの問題を解決しません。別の配列を使うことも、GroupVisitオブジェクトにプロパティを追加することもできます。この2番目のオプションはうまくいきました。

とにかく、動的に型指定された配列を持つこのような状況では、最初のオブジェクトの代わりにループの各繰り返しでnull値をチェックする「ループ型elvis演算子」が必要です。

関連する問題