2016-03-05 61 views
0

如果我有一個看起來像這樣angular2承諾觀測和DI

import {Injectable} from 'angular2/core'; 

@Injectable() 
export class MyService { 

    search(oSrchParams){ 

    let promise =() => 
    new Promise((resolve, reject) => 
     Meteor.call('mockSearchWS', (error:any, result:any) => error ? reject(error) : resolve(result)) 
    ); 

    promise().then(
     (result:Array<Object>) => { 
     return result 
     }, 
     (error) => { 
     console.log('failed', error); 
     } 
    ) 
    } 
} 

我怎樣才能把它,並得到一個值,當它被注射服務?像這樣:

import {Component} from 'angular2/core'; 
import {MyService} from './my-service'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/toPromise'; 

@Component ({ 
    selector: 'search', 
    providers:[MyService] 
}) 

export class App { 
    items: Array<string>; 
    constructor(private myService: MyService) { 
} 

search(term) { 
    // this.myService.search(term).then(items => this.items = items); 
    // this.myService.search(term).subscribe() 
    } 
} 

我不確定服務是否是可觀察的。我見過的大多數例子都使用http。

+0

如果你想讓它像'return promise()那樣返回承諾,那麼(' –

+0

是否使用Mongo? –

回答

0

你必須在你的搜索方法返回的承諾:

search(oSrchParams){ 

    let promise =() => 
    new Promise((resolve, reject) => 
     Meteor.call('mockSearchWS', (error:any, result:any) => error ? reject(error) : resolve(result)) 
    ); 

    return promise().then(
     (result:Array<Object>) => { 
     return result 
     }, 
     (error) => { 
     console.log('failed', error); 
     } 
    ) 
    } 
} 

這樣你就可以再調用在調用此方法的組件:

search(term) { 
    this.myService.search(term).then(items => this.items = items); 
} 
+0

感謝您的解決方案!好的,我打算在這裏放一些代碼,但是這沒有多行......呃 – shotleybuilder

0

只是一個任何人在這裏找到他們的方式的情侶。我包括爲方法

search(oSrchParams): any { ...} 

A型和通話成爲

this._searchCall.search(oSrchParams).then(
    (item) => (
    this._ngZone.run(()=>{ 
     this.items = result, 
     (console.log("search", JSON.stringify(this.items))) 
    }) 
) 
); 

ngZone注入喜歡該服務的構造函數,並確保到this.items變化被反映在瀏覽器中。我可能有太多的(),但它的工作原理:-)