以前曾经问过,但我找不到有帮助的答案。我希望oResult在调用之后更改其值。答案必须适合运行ng2,流星和角度流星。谢谢!
/// <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
});
}
});
}
}
修改
我已经缩短了代码并试图探索这个&#39;这个&#39;是问题。没有角度流星组件会对Meteor.call的执行产生影响。但是,在执行调用后,ng2仍然无法更改模板。而且我已经尝试过使用和不使用NgZone。可能会转移ng2&#39;因为我确实没有大脑或时间来抓住像这样的琐碎事情!
/// <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);
}
答案 0 :(得分: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;
}
}));
}
}
答案 1 :(得分: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
});
}
});
}
}
答案 2 :(得分:0)
经过3个周末(我是一个周末编码员),我发现了一些有用的东西!
这似乎不需要ng2-meteor软件包。
/// <reference path="../../typings/angular2-meteor.d.ts" />
import {Component, View, NgZone} from 'angular2/core';
@Component({
selector: 'testcall',
template: `
<button (click)="testCall()">Get TestCall Data</button>
<div>{{oResult}}</div>
`,
inputs: ['oResult']
})
export class TestCall {
oResult:any
constructor(private _ngZone: NgZone) {
}
testCall(): void {
var promise = function() {
return new Promise((resolve, reject) =>
Meteor.call('testCall', (error:any, result:string) => error ? reject(error) : resolve(result))
);
};
promise()
.then(
(result) => {
this._ngZone.run(()=>{
this.oResult = result;
console.log(result);
})
}
)
}
}