打字稿对所有公共变量说“未定义”

时间:2014-05-30 08:23:43

标签: javascript knockout.js typescript

我收到了以下代码

module Absence {
export var instance: AbsenceViewModel;


export class ViewModel {

    public items: KnockoutObservableArray<AbsenceItem>;


    public reloadData() {
            this.items.removeAll();
    }
  }
}

在我的页面中,我使用此

创建一个实例
Absence.instance = new Absence.AbsenceViewModel();

现在我打电话

Absence.instance.reloadData(); 

它在浏览器控制台中说

  

无法读取未定义

的属性'removeAll'

但是我导入了我的淘汰库和其他所需的东西。所以它存在。

当我使用内部实例

Absence.instance.items.removeAll();

我错了什么?

修改:

我在一个单独的JS文件中编写了viewModel的dcklaration和实例的声明。这些文件在页面中被加载。页面准备好后,我在调试控制台中手动实例化ViewModel的实例。在这里我调用方法reloadData。因此,当我调用方法时,我可以确定所有类都可用。

2 个答案:

答案 0 :(得分:1)

我还不熟悉TypeScript中的get机制,所以当你能用它来解决你的问题时,我将其作为另一个答案添加,我认为这是解决问题的一般解决方案这个问题。

以下错误:

  

无法读取未定义

的属性'removeAll'

是由于您未初始化items数组而导致的。您只是将其声明为ViewModel类的属性。添加构造函数并以正确的方式初始化属性可以避免这些问题。因此,请将代码更新为:

module Absence {
export var instance: AbsenceViewModel;


export class ViewModel {

    public items: KnockoutObservableArray<AbsenceItem>;

    constructor(){
        this.items = ko.observableArray();
    }

    public reloadData() {
            this.items.removeAll();
    }
  }
}

答案 1 :(得分:0)

我发现了错误。 我必须创建一个getter来访问该属性。

 get elements(): KnockoutObservableArray<AbsenceItem> {
        return this.items;
    }

之后我可以关注

public reloadData() {
   this.elements.removeAll();
}

这对我有帮助