knockout.js - מערך של אובזרבלס ב-Knockout ב-TypeScript


מהי הדרך הנכונה לאתחל observableArray של Knockout במחלקת TypeScript?

אני עושה משהו כזה:

   module ViewModel { 

        declare var ko;

        export class IndexPageViewModel {       

                agencies: any;                   

                constructor () {               
                    this.agencies = ko.observableArray([]);              
                }                                                                                                   
        }
    }


var ivm = new ViewModel.IndexPageViewModel();
ivm.agencies.push({name: "name", alias : "alias"});
for (var i = 0; i < ivm.agencies.length; i++){
    alert(ivm.agencies[i].name);
 }

נראה פשוט מספיק, אבל כשאני מנסה לגשת לנכס agencies כפי שמצוין, ההרצה נתקעת. האם פספסתי משהו?

תשובה #1

זוהי השורה שבה הטעות שלך היא:

agencies[i]

כאשר אתה ניגש למערך שניתן לצפייה, הוא בעצם מכוסה בתוך פונקציה ולכן אתה ניגש אליו כך:

agencies()[i]

גם תעשה לעצמך טובה והורד את ההגדרות של Knockout מ: https://github.com/borisyankov/DefinitelyTyped

אז הכרז על התכונות שלך עם סוגים:

module ViewModel {

    export class IndexPageViewModel {

        agencies: KnockoutObservableArray;

        constructor () {
            this.agencies = ko.observableArray([]);
        }
    }
}

תשובה #2

רק עשיתי את זה ב-TypeScript 1.3 (למרות שזה אמור לעבוד גם בגרסאות קודמות):

pendingAddAssociations: KnockoutObservableArray<ControllerModel> = ko.observableArray<ControllerModel>([]);

לדוגמה שלך, אם יש לך מחלקת סוכנות.

export class IndexPageViewModel {

        agencies: KnockoutObservableArray<Agency>;

        constructor () {
            this.agencies = ko.observableArray<Agency>([]);
        }
    }

גם מצאתי שאתה יכול להקצות לכל this.agencies=<any>[]; זה שימושי אם אתה משתמש בתוסף Knockout ES5.