これは以前に尋ねられましたが、役立つ答えが見つかりません。呼び出し後に 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);
}