2

これは以前に尋ねられましたが、役立つ答えが見つかりません。呼び出し後に oResult の値を変更したい。答えは、実行中の ng2、meteor、および angular-meteor に適している必要があります。ありがとう!

/// <reference path="../../typings/angular2-meteor.d.ts" />

import {Input, Component, View, NgZone} from 'angular2/core';
import {MeteorComponent} from 'angular2-meteor';

@Component({
  selector: 'testcall',
  template: `
    <button (click)="testCall()">Get TestCall Data</button>
    <code><pre>{{oResult}}</pre></code>
  `
})

export class TestCall extends MeteorComponent {

  oResult:any

  constructor(private _ngZone: NgZone) {
    super();
    this.oResult = JSON.stringify({res: 'start'});
  }

  testCall(): void {
    Meteor.call('testCall', function(error,result) {
      if (error) {
        console.log('failed', error);
      } else {
          console.log('successful call', result);
          this._ngZone.run(() => {
              this.oResult = result
          });
      }
    });
  }
}

編集

コードを短くして、「これ」が問題であるかどうかを調査しようとしました。angular-meteor コンポーネントがないと、Meteor.call の実行に違いが生じます。しかし、呼び出しが実行された後でも、ng2 はテンプレートの変更に失敗します。そして、NgZone の有無にかかわらず試してみました。ng2 をダンプする可能性があります。このような些細なことに行き詰まる頭脳や時間がないのは確かです!

/// <reference path="../../typings/angular2-meteor.d.ts" />

import {Input, Component, View} from 'angular2/core';

@Component({
  selector: 'testcall',
  template: `
    <button (click)="testCall()">Get TestCall Data</button>
    <code><pre>{{oResult}}</pre></code>
  `
})

export class TestCall {

  oResult:any

  testCall(): void {
    Meteor.call('testCall', (error:any, result:any) => error ? 
    console.log('failed', error) : 
    (this.oResult=result, console.log('successful call', result, this.oResult)));
  }
}

編集

このぎこちないコードは、ある方法で機能します。Meteor.call を setTimeout のコールバックにする方法を提案できる人はいますか?

  testCall(): void {
    var self:any = this
    Meteor.call('testCall', (error:any, result:string) => error ?
      console.log('failed', error) :
      (self.oResult=result, console.log('successful call', self.oResult)));
    setTimeout(()=>{
      this.oResult=self.oResult;
    },2000);
  }
4

3 に答える 3

1

個人的には、非同期コールバック ロジック全体が Angular ゾーン内で同期的に実行されることを好みます。

export class TestComponent {
  oResult: any;

  constructor(private ngZone: NgZone) {
  }

  testCall(): void {
    Meteor.call('testCall', (error, result) => this.ngZone.run(() => {

      if (error)
        console.log('failed', error);
      else {
        console.log('successful call', result);
        this.oResult = result;
      }

    }));
  }
}
于 2016-11-30T10:45:43.423 に答える
0
export class TestCall extends MeteorComponent {

  oResult:any

  constructor(private zone: NgZone) {
    super();
    this.oResult = JSON.stringify({res: 'start'});
  }

  testCall(): void {
    Meteor.call('testCall', function(error,result) {
      if (error) {
        console.log('failed', error);
      } else {
          console.log('successful call', result);
        this.zone.run(() => { // do updates within Angular zones 
          this.oResult = result
        });
      }
    });
  }
}

Angular2 変更検出の手動トリガーも参照してください。

于 2016-02-06T13:46:51.163 に答える