필자는 ionic-storage (sqlite 및 indexedDB 용 래퍼)에 Event 객체를 저장하고 검색하는이 EventsStorage typescript 클래스를 가지고 있습니다. 처음부터 내 이벤트 클래스를 사용합니다.이 클래스를 타이프 크립트에서 재사용 가능하게 만드는 방법은 무엇입니까? 메타 프로그래밍? 하위 클래스? 주입 된 모듈?
위젯과 같이 이벤트 이외의 다른 용도로이 논리를 많이 사용하고 싶습니다.
나는 모든 스토리지 로직을 추출하기가 상대적으로 간단한 루비 배경에서 왔으며, 사실상 클래스 이벤트 인 ruby var을 설정하고 Event를 사용할 때마다 그 var를 사용합니다. 타이프 스크립트로 비슷한 것을 할 수 있습니까? 위젯과 같은 다른 클래스에이 클래스의 대부분을 재사용 할 수있는 또 다른 메 커닉이 있습니까?
내 EventsStorage 클래스는 실제로 가벼워졌으며, 필요한 모든 다른 인스턴스에 복사/붙여 넣기해야하는 this.some_storage_module.get_ids()
또는 this.some_storage_module.insert_new_objs()
으로 호출하는 것이 아닙니다. 이 같은
뭔가 :
export class EventsStorage { // extends BaseStorage (maybe??)
constructor(){
super(Event, 'events'); // or some small set of magical args
}
}
가 여기에 기존 클래스입니다 : 당신이 제네릭을 사용하려면 같은
import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
import { Event } from '../classes/event';
// EventsStorage < EntityStorage
// - tracks local storage info
// - a key to an array of saved objects
// - a query() method that returns saved objects
@Injectable()
export class EventsStorage {
base_key: string;
ids_key: string;
constructor(
private storage: Storage
){
this.base_key = 'event';
this.ids_key = [this.base_key, 'ids'].join('_');
}
get_ids(): Promise<any>{
return this.storage.ready().then(() => {
return this.storage.get(this.ids_key).then((val) => {
if(val === null){
return [];
} else {
return val;
}
});
});
}
insert_new_objs(new_objs: any): Promise<any>{
return new_objs.reduce((prev: Promise<string>, cur: any): Promise<any> => {
return prev.then(() => {
return this.storage.set(cur._id, cur.event);
});
}, Promise.resolve()).then(() => {
console.log('saving event_ids');
return this.storage.set(this.ids_key, new_objs.map(obj => obj._id));
});
}
update(events: Event[]): Promise<any> {
let new_objs = events.map((event) => {
return {
_id: [this.base_key, event.id].join('_'),
event: event
};
});
return this.insert_new_objs(new_objs);
}
query(): Promise<Event[]>{
let events = [];
return this.get_ids().then((ids) => {
return ids.reduce((prev: Promise<string>, cur: string): Promise<any> => {
return prev.then(() => {
return this.get_id(cur).then((raw_event) => {
events = events.concat([raw_event as Event]);
return events;
});
});
}, Promise.resolve());
});
}
get_id(id: string): Promise<Event>{
return this.storage.get(id).then((raw_event) => {
return raw_event;
});
}
}
첫 번째 코드 블록에서 주석에 명시된대로 클래스를 확장 할 수 있습니다. '클래스 EventsStorage extends EntityStorage', 참조 : http://www.typescriptlang.org/docs/handbook/classes.html – cyrix
예, 알고 있습니다. 하지만이 코드를 단지 재사용 할 수있는 것보다 더 많이 사용하는 것 같습니다 ... FooBaseClass를 확장하십시오 – jsharpe