在TypeScript中Knockout observableArray

时间:2012-10-31 21:57:57

标签: knockout.js typescript ko.observablearray

在TypeScript类中初始化Knockout observableArray的正确方法是什么?

我正在做这样的事情:

   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属性时,执行会挂起。我错过了什么吗?

2 个答案:

答案 0 :(得分:13)

这一行是您的错误所在:

agencies[i]

当你访问一个可观察的数组时,它实际上包含在一个函数中,所以你可以访问它:

agencies()[i]

还要帮自己一个忙,并从以下位置下载Knockout定义: https://github.com/borisyankov/DefinitelyTyped

然后使用类型声明属性:

module ViewModel {

    export class IndexPageViewModel {

        agencies: KnockoutObservableArray;

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

答案 1 :(得分:5)

我刚刚在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 plugin,这非常有用。