角度2:Promiseでコンポーネントの「this」を操作する

コリン・マクレー

更新私はreturnコンソールログの後に置いて、問題が約束ではないと判断しました-それはそれをうまく読んでいます。以下のコードで強調表示している行this.contentItems = cpl.ary as ContentItem[];で、エラーが発生している場所です。これが、4つのアイテムの配列であるcpl1つのプロパティを持つオブジェクトであることを確認しましたaryコンソールログに正常に表示されます。しかし、私がaryプロパティを取得しようとすると、as ContentItem[]それがnull思い付きContent[]、左側の私の空割り当てようとします。したがって、これは純粋にキャストまたはその他のタイプ割り当ての問題です。答えが見つかったら、この質問の件名を変更します。

私の問題は、content-display.component.tsのメソッドでthis.contentItemsnullに設定されることthenです。

私が消費しているJSONは次のとおりです。

{ "ary":[
  {
    "id": "1",
    "name": "Test Project",
    "nextDate": "2016-12-01T16:00:00",
    "dateDescription": "ends",
    "contentType": "project",
    "link": "http://google.com",
    "topics": ["1"]
  },
  {
    "id": "3",
    "name": "Dummy Article",
    "nextDate": "2016-12-21T00:00:00",
    "dateDescription": "expires",
    "contentType": "article",
    "link": "http://msn.com",
    "topics": ["2"]
  }
]}

私のcontent-item.service.ts:

getContentItems(): Promise<ContentPayload> {
  if( window.location.hostname === "localhost" )
    return Promise.resolve( CONTENTITEMS );
  else
    return this.http.get( this.contentUrl )
                  .toPromise()
                  .then( (response) => { return response.json() } )
                  .then( (data) => { return data as ContentPayload })
                  .catch( this.handleError );
}

そして、私のコンテンツに戻ります-display.component.ts

private contentItems: ContentItem[] = [];

getContentItems(): void {
  this.contentItemService.getContentItems()
    .then( (contentPayload) => this.getArrayFromPayload )
    .then( this.getSelectOptions );
}

getArrayFromPayload( cpl: ContentPayload ): void {
  this.contentItems = cpl["ary"];
  /********** above, this.contentItems is set to null ************/
  this.filteredItems = this.contentItems;
}

ContentPayload:

export class ContentPayload {
  ary: any[];
}

ContentItem:

export class ContentItem {
  id: string;
  name: string;
  nextDate: Date;
  dateDescription: string;
  contentType: string;
  link: string;
  isClicked?: boolean = false;
  topics: string[];
}

これは完全を期すために含まれています。それが何をするかは重要ではありません、エラーは上記で発生します。

getSelectOptions( ): void {
  // return TOPICMAP;
  var topicMap: Topic[] = TOPICMAP;
  var filteredTopicMap: Topic[] = [];
  var uniqueValues: string[] = this.makeContentSet( this.getTopicIDs( this.contentItems ) );
  for( var i = 0; i < uniqueValues.length; i++ ) {
    filteredTopicMap.push( this.getTopicWithID( topicMap, uniqueValues[i] ) );
  }
  this.selectOptions = filteredTopicMap;
}

そして、このコンポーネントの私のテンプレート(スタイルの不一致と「これ」の使用は最終的にクリーンアップされます。iPadにバックティックがないことをご存知ですか?):

template: `
<h2>{{title}}</h2>
<div>Maximum of 20 items</div>
<div>Order:
  <span [class.clicked]="latestOldest==='latest'" (click)="mySort('latest')">latest first</span>
  |
  <span [class.clicked]="latestOldest==='oldest'" (click)="mySort('oldest');">oldest first</span>
</div>
<div>
  Filters:
  <ng-select
    [options] = "this.selectOptions"
    [multiple] = "this.showMultiple"
    placeholder = "Select topics"
    [allowClear] = "true"
    theme = "default"
    (selected) = "onSelected( $event )"
    (deselected) = "onDeselected( $event )">
  </ng-select>
<ul>
  <li *ngFor="let contentItem of filteredItems"
      (click)="onClick(contentItem)"
      class="{{contentItem.contentType}}"
      [class.clicked]="contentItem.isClicked">
    <h3>{{contentItem.name}}</h3>
    <div>{{ contentItem.contentType | uppercase }} {{ contentItem.dateDescription}}
      {{ contentItem.nextDate.toGMTString() | date:'mediumDate' }}
      {{ (contentItem.contentType !== "article")? (contentItem.nextDate | date:'shortTime'): '' }}
    </div>
  </li>
</ul>
</div>
`
アンドレアス・イェーグル

あなたの問題はthis正しく取り扱わないことが原因です。まさにこのトピックに関して、ここには多くの質問があります。

あなたが以下を書くとき

getContentItems(): void {
  this.contentItemService.getContentItems()
    .then( (contentPayload) => this.getArrayFromPayload )
    .then( this.getSelectOptions );
}

次に、基本的に、それが定義されたオブジェクトの関数を(あなたの場合のコンポーネントインスタンスから)引き出します。関数はまだいくつかを参照してthisいますが、thisそれ以上コンポーネントで呼び出されることはありません。それが問題の原因です。

使用に関するコメントで言及されている方法.then( this.getArrayFromPayload )も機能しません。これは、関数が呼び出されたときにコンテキストも変更するためです。

これを修正する方法はいくつかあります。このようbind()に、thenメソッドに渡された関数を呼び出し元コンテキストのthisに渡すことができます。

.then(this.getArrayFromPayload.bind(this))

そうするthisことで、関数が呼び出されたときに保持されるように、現在使用されている関数が設定されます。(基本的に、この参照が正しい新しい関数を返します)

別の方法は、独自のthisコンテキストを持たないため、外部を参照する矢印関数を使用することthisです。

getArrayFromPayload = (cpl: ContentPayload) => {
  this.contentItems = cpl["ary"];
  this.filteredItems = this.contentItems;
}

そうすることで、のように呼び出すことができます.then( this.getArrayFromPayload )

基礎となる概念の詳細についてはthis、JavaScriptの基本をカバーするこの素晴らしい回答を参照してくださいコールバック内の正しい `this`コンテキストにアクセスする方法は?

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

角度2コンポーネント内でPromise結果をどのように使用しますか?

分類Dev

AngularでコンポーネントのDOM要素を操作する

分類Dev

コンポーネントAをコンポーネントBの角度でレンダリングする

分類Dev

角度2の子コンポーネントで親コンポーネントの名前を取得するにはどうすればよいですか?

分類Dev

オブジェクト全体をあるコンポーネントから別のコンポーネントに角度2で送信する

分類Dev

コンポーネント内の@Inputデータを角度操作

分類Dev

角度2の別のコンポーネントで複合型オブジェクトを使用する

分類Dev

角度コンポーネントで「require」を使用する

分類Dev

角度コンポーネントでdebounceTimeを使用する方法は?

分類Dev

コンポーネントを角度で動的に削除する方法

分類Dev

DOMの他の場所で角度2コンポーネントの結果を再表示する

分類Dev

Angular2の特定のルートでコンポーネントを操作する方法

分類Dev

角度4で子コンポーネント内の親値を印刷する方法

分類Dev

角度コンポーネントでブートストラップコンポーネントを使用する

分類Dev

角度:1つのコンポーネントで同じ<router-outlet>を2回使用する

分類Dev

NSPredicateで2つのコンポーネントを比較する

分類Dev

親コンポーネントの角度4のコンポーネントを動的にロードする方法

分類Dev

角度2での兄弟コンポーネントの相互作用

分類Dev

角度2でブートストラップコンポーネントを使用する

分類Dev

角度2forkJoinでコンポーネントをテストします

分類Dev

別のコンポーネントのセレクターを持つ角度コンポーネントで特定のスタイルを変更する方法

分類Dev

角度2のすべてのコンポーネントにサービスをロードする方法

分類Dev

角度2コンポーネントに別のコンポーネントが含まれているかどうかを単体テストする方法

分類Dev

角度2で1つのコンポーネントサービス応答を他のコンポーネントに渡す方法

分類Dev

角度2で1つのコンポーネントから別のコンポーネントにデータを渡す方法は?

分類Dev

Firebaseでトランザクションのpromise'.then 'コンポーネントを使用する方法

分類Dev

角度で動的にロードされたモジュール コンポーネントで既存のコンポーネントを使用する方法

分類Dev

ng-zorroコンポーネントを角度のあるcssコンポーネントでスタイリングする方法は?

分類Dev

コンポーネントを角度2/4で動的に追加

Related 関連記事

  1. 1

    角度2コンポーネント内でPromise結果をどのように使用しますか?

  2. 2

    AngularでコンポーネントのDOM要素を操作する

  3. 3

    コンポーネントAをコンポーネントBの角度でレンダリングする

  4. 4

    角度2の子コンポーネントで親コンポーネントの名前を取得するにはどうすればよいですか?

  5. 5

    オブジェクト全体をあるコンポーネントから別のコンポーネントに角度2で送信する

  6. 6

    コンポーネント内の@Inputデータを角度操作

  7. 7

    角度2の別のコンポーネントで複合型オブジェクトを使用する

  8. 8

    角度コンポーネントで「require」を使用する

  9. 9

    角度コンポーネントでdebounceTimeを使用する方法は?

  10. 10

    コンポーネントを角度で動的に削除する方法

  11. 11

    DOMの他の場所で角度2コンポーネントの結果を再表示する

  12. 12

    Angular2の特定のルートでコンポーネントを操作する方法

  13. 13

    角度4で子コンポーネント内の親値を印刷する方法

  14. 14

    角度コンポーネントでブートストラップコンポーネントを使用する

  15. 15

    角度:1つのコンポーネントで同じ<router-outlet>を2回使用する

  16. 16

    NSPredicateで2つのコンポーネントを比較する

  17. 17

    親コンポーネントの角度4のコンポーネントを動的にロードする方法

  18. 18

    角度2での兄弟コンポーネントの相互作用

  19. 19

    角度2でブートストラップコンポーネントを使用する

  20. 20

    角度2forkJoinでコンポーネントをテストします

  21. 21

    別のコンポーネントのセレクターを持つ角度コンポーネントで特定のスタイルを変更する方法

  22. 22

    角度2のすべてのコンポーネントにサービスをロードする方法

  23. 23

    角度2コンポーネントに別のコンポーネントが含まれているかどうかを単体テストする方法

  24. 24

    角度2で1つのコンポーネントサービス応答を他のコンポーネントに渡す方法

  25. 25

    角度2で1つのコンポーネントから別のコンポーネントにデータを渡す方法は?

  26. 26

    Firebaseでトランザクションのpromise'.then 'コンポーネントを使用する方法

  27. 27

    角度で動的にロードされたモジュール コンポーネントで既存のコンポーネントを使用する方法

  28. 28

    ng-zorroコンポーネントを角度のあるcssコンポーネントでスタイリングする方法は?

  29. 29

    コンポーネントを角度2/4で動的に追加

ホットタグ

アーカイブ