2016-02-05 8 views
44

Mam usługę, która ma tę metodę:Jak stworzyć obserwowalne dane statyczne podobne do http w Angular?

export class TestModelService { 

    public testModel: TestModel; 

    constructor(@Inject(Http) public http: Http) { 
    } 

    public fetchModel(uuid: string = undefined): Observable<string> { 
     if(!uuid) { 
      //return Observable of JSON.stringify(new TestModel()); 
     } 
     else { 
      return this.http.get("http://localhost:8080/myapp/api/model/" + uuid) 
       .map(res => res.text()); 
     } 
    } 
} 

w konstruktorze komponentu ja nabywającym tak:

export class MyComponent { 
    testModel: TestModel; 
    testModelService: TestModelService; 

    constructor(@Inject(TestModelService) testModelService) { 
     this.testModelService = testModelService; 

     testService.fetchModel("29f4fddc-155a-4f26-9db6-5a431ecd5d44").subscribe(
      data => { this.testModel = FactModel.fromJson(JSON.parse(data)); }, 
      err => console.log(err) 
    ); 
    } 
} 

To działa, jeśli obiekt pochodzi z server..but jestem próba stworzenia obserwowalnego, który będzie działał z danym istniejącym wywołaniem funkcji subscribe() dla statycznego ciągu znaków (dzieje się tak, gdy testModelService.fetchModel() nie jest podany jako uuid), więc w obu przypadkach jest to płynne działanie. czy to możliwe?

Odpowiedz

70

Może spróbować użyć metody of klasy Obserable:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/of'; 

public fetchModel(uuid: string = undefined): Observable<string> { 
    if(!uuid) { 
    return Observable.of(new TestModel()).map(o => JSON.stringify(o)); 
    } 
    else { 
    return this.http.get("http://localhost:8080/myapp/api/model/" + uuid) 
      .map(res => res.text()); 
    } 
} 
+0

To było niesamowite! Zadziałało! Próbowałem wielu rzeczy takich jak Observable.from() itp. Dokumentacja API dla Observable nie jest najczystsza/najbardziej przyjazna dla użytkownika w tym momencie! Dzięki :) –

+2

Tak, zgodził się ;-) Operatorem 'od' jest dla tablic ... –

+2

@ThierryTemplier Czy istnieje sposób na wdrożenie tego rodzaju zachowania przy użyciu makr Angular 2? Np. Konfigurowanie fałszywego połączenia w klasie z fałszywą odpowiedzią? – Jefftopia

13

rzeczy wydają się zmieniły od Kątowymi 2.0.0

import { Observable } from 'rxjs/Observable'; 
import { Subscriber } from 'rxjs/Subscriber'; 
// ... 
public fetchModel(uuid: string = undefined): Observable<string> { 
    if(!uuid) { 
    return new Observable<TestModel>((subscriber: Subscriber<TestModel>) => subscriber.next(new TestModel())).map(o => JSON.stringify(o)); 
    } 
    else { 
    return this.http.get("http://localhost:8080/myapp/api/model/" + uuid) 
      .map(res => res.text()); 
    } 
} 

Funkcja .next() zostanie wywołana na swoje abonent.

+1

Przeprowadziłem migrację do Angular 2.1.2. Stary sposób wydaje się być nadal obsługiwany. Czy mógłbyś wyjaśnić, dlaczego jest to lepsze rozwiązanie, czy też jest to konwencja? Zmienię go we wszystkich miejscach w moim kodzie i ponownie przyjmuję. Dzięki –

+5

@MichailMichailidis, z miesiącem retrospekcji, wydaje mi się, że oba są jednakowo ważne, główną różnicą jest to, że rozwiązanie Thierry wymaga od ciebie zaimportuj funkcję 'of' programu rxjs, np.' import 'rxjs/add/observable/of'' –

+0

To naprawdę uratowało mój dzień. Świetny – suryakiran

1

W ten sposób można utworzyć proste obserwowalne dla danych statycznych.

let observable=Observable.create(observer => { 
      setTimeout(() => { 
      let users = [{username:"balwant.padwal",city:"pune"}, 
         {username:"test",city:"mumbai"}] 
      observer.next(users); // This method same as resolve() method from Angular 1 
      console.log("am done"); 
      observer.complete();//to show we are done with our processing 
      // observer.error(new Error("error message")); 
      }, 2000); 

     }) 
    to subscribe to it is very easy 

    observable.subscripe((data)=>{ 
    console.log(data); // users array display 
    }); 

Mam nadzieję, że ta odpowiedź jest pomocna. Możemy użyć wywołania HTTP zamiast danych statycznych.