typescript - Angular2 Observable.forkJoin از متغیرهای observable - ReferenceError: Observable تعریف نشده است
میخواهم از شما کمک بخواهم. کدی که فکر میکنم مهم نیست را حذف کردهام. بیایید فرض کنیم فایلی با پسوند TS وجود دارد که شامل فراخوانیهای سرویس است:
// پرونده: someService.ts
@Injectable()
export class SomeService {
method1(){
var observable = this.http.get(someUrl)
.map((res: Response) =><MyClass[]>res.json());
return observable;
}
method2(){
// Similar to method1
}
}
// فایل: someComponent.ts
لطفاً توجه داشته باشید که this.method1observable و method2observable به درستی از کامپوننت والد (ریشه) اختصاص داده شدهاند و نوع آنها Observable است.
import {Observable} from 'rxjs/Observable';
export class SomeClass {
public m1: Observable<MyClass[]>;
public m2: Observable<AnotherClass[]>
ngOnInit() {
Observable.forkJoin(this.m1,this.m2) //<- ERROR HERE
.subscribe(data => {
this.myFunction(data[0], data[1]);
requestAnimationFrame(this.renderLoop);
});
}
}
من خطای «Uncaught ReferenceError: Observable تعریف نشده است» را دریافت میکنم. آیا نمیدانی من چه اشتباهی انجام میدهم؟ من چند مثال دیدم که در آنها Observable.forkJoin داخل یک سرویس فراخوانی شده است. اما اگر بخواهم آن را داخل یک کامپوننت فراخوانی کنم چه میشود؟
پاسخ شماره ۱
شما میتوانید سعی کنید به این روش وارد کنید:
import {Observable} from 'rxjs/Rx';
به جای:
import {Observable} from 'rxjs/Observable';
شما همچنین باید از یک آرایه برای ارائه قابل مشاهده های خود به متد forkJoin استفاده کنید:
ngOnInit() {
Observable.forkJoin([this.m1,this.m2])
.subscribe(data => {
this.myFunction(data[0], data[1]);
requestAnimationFrame(this.renderLoop);
});
}
و فراموش نکنید که ورودیها را در @Component مشخص کنید:
@Component({
inputs: ['m1', 'm2']
})
پاسخ شماره ۲
شما باید از وارد کردن کل کتابخانه rxjs خودداری کنید زیرا نسبتاً بزرگ است. اگر ایمپورتهای زیر را در هر جایی از برنامه خود داشته باشید، کل rxjs را وارد خواهید کرد، بنابراین این موضوع را در نظر داشته باشید:
import {Observable} from 'rxjs';
یا
import {Observable} from 'rxjs/Rx';
شما میتوانید در عوض ویژگیهای فردی که استفاده خواهید کرد را وارد کنید، برای مثال:
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/observable/forkJoin';
بهروزرسانی: از نسخه ۵.۵ rxjs به بعد، روش پیشنهادی برای وارد کردن عملگرها به این صورت است:
import { range } from 'rxjs/observable/range';
import { map, filter, scan } from 'rxjs/operators';
const source$ = range(0, 10);
source$.pipe(
filter(x => x % 2 === 0),
map(x => x + x),
scan((acc, x) => acc + x, 0)
)
.subscribe(x => console.log(x))
