উপাদানটি রেন্ডার হওয়ার আগে আমি আমার এপিআই থেকে একটি ইভেন্ট লোড করার চেষ্টা করছি। বর্তমানে আমি আমার API পরিষেবাটি ব্যবহার করছি যা আমি উপাদানটির ngOnInit ফাংশন থেকে কল করি।
আমার EventRegister
উপাদান:
import {Component, OnInit, ElementRef} from "angular2/core";
import {ApiService} from "../../services/api.service";
import {EventModel} from '../../models/EventModel';
import {Router, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig, RouteParams, RouterLink} from 'angular2/router';
import {FORM_PROVIDERS, FORM_DIRECTIVES, Control} from 'angular2/common';
@Component({
selector: "register",
templateUrl: "/events/register"
// provider array is added in parent component
})
export class EventRegister implements OnInit {
eventId: string;
ev: EventModel;
constructor(private _apiService: ApiService,
params: RouteParams) {
this.eventId = params.get('id');
}
fetchEvent(): void {
this._apiService.get.event(this.eventId).then(event => {
this.ev = event;
console.log(event); // Has a value
console.log(this.ev); // Has a value
});
}
ngOnInit() {
this.fetchEvent();
console.log(this.ev); // Has NO value
}
}
আমার EventRegister
টেম্পলেট
<register>
Hi this sentence is always visible, even if `ev property` is not loaded yet
<div *ngIf="ev">
I should be visible as soon the `ev property` is loaded. Currently I am never shown.
<span>{{event.id }}</span>
</div>
</register>
আমার API পরিষেবা
import "rxjs/Rx"
import {Http} from "angular2/http";
import {Injectable} from "angular2/core";
import {EventModel} from '../models/EventModel';
@Injectable()
export class ApiService {
constructor(private http: Http) { }
get = {
event: (eventId: string): Promise<EventModel> => {
return this.http.get("api/events/" + eventId).map(response => {
return response.json(); // Has a value
}).toPromise();
}
}
}
ফাংশনটিতে API কল করার আগে ngOnInit
ডেটা আনার আগে উপাদানটি রেন্ডার হয়ে যায় । সুতরাং আমি কখনই আমার ভিউ টেমপ্লেটে ইভেন্ট আইডি দেখতে পাচ্ছি না। সুতরাং দেখে মনে হচ্ছে এটি একটি এএসআইএনসি সমস্যা। আমি সম্পত্তি নির্ধারিত হওয়ার পরে ev
( EventRegister
উপাদান) বাঁধাই করে কিছু কাজ ev
করার আশা করেছি। দুঃখজনকভাবে সম্পত্তিটি সেট হওয়ার div
সাথে এটি চিহ্নিত চিহ্নটি দেখায় না *ngIf="ev"
।
প্রশ্ন: আমি কি ভাল পন্থা ব্যবহার করছি? যদি না; উপাদানটি রেন্ডার শুরু হওয়ার আগে ডেটা লোড করার সর্বোত্তম উপায় কী?
উল্লেখ্য:ngOnInit
পদ্ধতির এই ব্যবহার করা হয় angular2 টিউটোরিয়াল ।
সম্পাদনা করুন:
দুটি সম্ভাব্য সমাধান। প্রথমটি ছিল খনন করা fetchEvent
এবং ngOnInit
ফাংশনে কেবলমাত্র API পরিষেবাটি ব্যবহার করা ।
ngOnInit() {
this._apiService.get.event(this.eventId).then(event => this.ev = event);
}
দ্বিতীয় সমাধান। দেওয়া উত্তরটি পছন্দ করুন।
fetchEvent(): Promise<EventModel> {
return this._apiService.get.event(this.eventId);
}
ngOnInit() {
this.fetchEvent().then(event => this.ev = event);
}
fetchEvent
ফাংশনটি সরিয়েছি এবং কেবলমাত্রapiService.get.event
ফাংশনটি এতেngOnInit
রেখেছি এবং এটি আমার উদ্দেশ্য হিসাবে কাজ করেছে। ধন্যবাদ! আমি আপনাকে উত্তর হিসাবে তাড়াতাড়ি আপনি উত্তর গ্রহণ করব।