ค้นหาเว็บไซต์

javascript - มุมมอง Backbone ไม่สามารถใช้คอลเลกชัน Backbone ใน typescript ได้


ฉันกำลังพยายามสร้างมุมมองของ Backbone ที่ผูกกับคอลเลกชันของ Backbone แต่ตามไฟล์คำจำกัดความจาก DefinitelyTyped วัตถุมุมมองของ Backbone สามารถรับได้เฉพาะโมเดลเท่านั้นในฐานะพารามิเตอร์ประเภททั่วไป ฉันจะผูกมุมมองกับคอลเลกชันได้อย่างไร?

โค้ดปัจจุบันของฉันแสดงข้อผิดพลาด:

export class EnvironmentMenu extends Backbone.View<EnvironmentCollection>{

constructor(options?: Backbone.ViewOptions<EnvironmentCollection>) {
         super(options);
    }
}

ข้อผิดพลาดคือ Type 'EnvironmentCollection' ไม่เป็นไปตามข้อจำกัด 'Backbone.Model' สำหรับพารามิเตอร์ชนิด 'TModel extends Backbone.Model'

ซึ่งฉันสมมติว่าน่าจะเป็นเพราะบรรทัดนี้ในคำนิยาม:

class Collection<TModel extends Model> extends ModelBase

โมเดลและคอลเลคชันของฉันตอนนี้เป็นแค่เปลือกเท่านั้น

แบบจำลองสิ่งแวดล้อม

export class EnvironmentModel extends Backbone.Model {
    constructor(options?) {
        super(options);
    }
}

การเก็บรวบรวมสิ่งแวดล้อม

export class EnvironmentCollection 
    extends Backbone.Collection<EnvironmentModel> {

    constructor(options?) {
        super(options);
        this.model = EnvironmentModel;
    }
} 

คำตอบ #1

คำตอบสำหรับเรื่องนี้ก็คือการห่อชุดข้อมูลในโมเดลแยกออกมา ซึ่งในสถานการณ์เฉพาะนี้เพิ่มมูลค่าเพิ่มเติมเพียงเล็กน้อยนอกเหนือจากการคอมไพล์โดยไม่เกิดข้อผิดพลาด แต่ฉันพบว่ามันมีประโยชน์ในการเก็บข้อมูลเพิ่มเติมที่เกี่ยวข้องกับชุดข้อมูลซึ่งยังไม่เป็นส่วนหนึ่งของคุณสมบัติของชุดข้อมูลนั้น

export class EnvironmentViewCollection extends Backbone.Model {
    constructor(collection: EnvironmentCollection, options?: any) {    
         options = options || {};
         options.innerCollection = collection;
    }

    getCollection() : EnvironmentCollection {
         return this.get('innerCollection');
    }
}

จากนั้นคุณสามารถใช้โมเดลนั้นในมุมมองได้

export class EnvironmentMenu extends Backbone.View<EnvironmentViewCollection> {
    constructor(options?: Backbone.ViewOptions<EnvironmentViewCollection>) {
        super(options);
    }

    useCollection() : void {
        var collectionLength = this.model.getCollection();
        console.log('The length of the collection is', collectionLength);
    }
}