Javascript 类型脚本、淘汰和类

Javascript 类型脚本、淘汰和类,javascript,asp.net-web-api,knockout.js,Javascript,Asp.net Web Api,Knockout.js,在我的typescript文件中,我试图创建一个可观察的类,它保存所有与UI相关的字段,然后我可以获取这些字段并将其发布到服务器。我将它从我的视图模型中删除,因为我想将我发布的字段与所有其他视图模型项分开 因此,在我的typescript文件中,首先,我创建了我的UI模型 interface Model { id: KnockoutObservable<number>; } class MyViewModel { model: KnockoutObservabl

在我的typescript文件中,我试图创建一个可观察的类,它保存所有与UI相关的字段,然后我可以获取这些字段并将其发布到服务器。我将它从我的视图模型中删除,因为我想将我发布的字段与所有其他视图模型项分开

因此,在我的typescript文件中,首先,我创建了我的UI模型

interface Model {
    id: KnockoutObservable<number>;
}


class MyViewModel {

    model: KnockoutObservable<Model>;

    constructor() {

    $.get("/api/debt/1")
        .done((data) => {
            this.model().id(data.ID);
        }); 
    }

}
接口模型{
id:可观察到的敲除;
}
类MyViewModel{
模型:敲除可观察;
构造函数(){
$.get(“/api/debt/1”)
.完成((数据)=>{
this.model().id(data.id);
}); 
}
}
这不管用。出于某种原因,“this.model”是未知的

我想做的是可能的吗?我做错了什么


编辑:简化为仅使用id属性。使用接口,而不是类。在此.model().id(data.id)上失败,因为“模式不是函数”。不知道现在如何初始化模型。

您已经定义了模型应该是什么,它是一个类型为“KnockoutObservable”的对象,但是您实际上还没有创建任何东西来填充变量,所以它的值仍然没有定义

尝试替换
模型:KnockoutObservable带有

model: KnockoutObservable<Model> = ko.observable(new Model());
编辑2:

如果对回调使用lambda表达式而不是标准函数声明,则Typescript将保留“this”的上下文

$.get("/api/debt/1")
        .done((data) => {
             this.model().id(data.ID);
        }); 
您可能还希望将新值分配给“id”可观察对象的现有实例,而不是替换可观察对象。如果覆盖了它绑定到的可观察对象,那么Knockout的依赖项跟踪就不起作用。因此,您可以像使用函数一样使用observable,而不是使用赋值运算符(=)

编辑3:

下面是一个更完整的示例:

class Model {
    id: KnockoutObservable<number>;
}


class MyViewModel {

    model: KnockoutObservable<Model> = ko.observable(new Model());

    constructor() {

      this.model().id = ko.observable(0);

      $.get("/api/debt/1")
        .done((data) => {
            this.model().id(data.ID);
        }); 
    }

}
类模型{
id:可观察到的敲除;
}
类MyViewModel{
模型:KnockoutObservable=ko.observable(新模型());
构造函数(){
this.model().id=ko.observable(0);
$.get(“/api/debt/1”)
.完成((数据)=>{
this.model().id(data.id);
}); 
}
}

谢谢!在我的.done中,在我完成get之后,这是分配的正确方式吗?我已经做了您所说的更改,但在作业中,它告诉我“TypeError:this.model不是函数”。此外,“模型”应该是可见的吗?我希望这些属性是可观察的。也许这也是一个错误?我认为下面的问题可能是“this”不再指类,而是指.done回调函数。Javascript那样很奇怪。如果将.done函数改为lambda表达式,则typescript将自动继承“this”上下文。用lambda示例更新了我的答案。如果需要更多解释,请告诉我。谢谢@JasonSpake。。。越来越近,但仍然不起作用。我已将“类模型”更改为“接口模型”,因为这可能更正确。然后将模型实例定义为“model:KnockoutObservable;”。。。然后在我的.done中,我尝试分配如下值“this.model().id(data.id);”。我将tht函数更改为lambda。但在尝试分配id时仍然会得到“this.model不是函数”。此时,您的代码与最初发布的代码有点不同。您是否可以使用更新的粘贴内容编辑您的问题?
class Model {
    id: KnockoutObservable<number>;
}


class MyViewModel {

    model: KnockoutObservable<Model> = ko.observable(new Model());

    constructor() {

      this.model().id = ko.observable(0);

      $.get("/api/debt/1")
        .done((data) => {
            this.model().id(data.ID);
        }); 
    }

}