Knockout.js 敲除可观察属性包含函数代码

Knockout.js 敲除可观察属性包含函数代码,knockout.js,typescript,Knockout.js,Typescript,首先,我使用敲除和打字脚本 给定以下源代码: class LookupEditorVM { lookups: KnockoutObservableArray<LookupVM>; selected: KnockoutObservable<LookupVM>; baseURL: string = "/Admin/Lookup/"; constructor() { this.lookups = ko.observableArr

首先,我使用敲除和打字脚本

给定以下源代码:

class LookupEditorVM {
    lookups: KnockoutObservableArray<LookupVM>;
    selected: KnockoutObservable<LookupVM>;
    baseURL: string = "/Admin/Lookup/";

    constructor() {
        this.lookups = ko.observableArray<LookupVM>([]);
        this.selected = ko.observable<LookupVM>();

        $.getJSON(this.baseURL + "ListLookups", (data) => {
            ko.mapping.fromJS(data, {}, this.lookups);
        });

        this.selected.subscribe(() => {
            this.getListItems();
        });
    }

    getListItems() {
        $.getJSON(this.baseURL + "GetLookupItems/" + this.selected().ID, (data) => {
            ko.mapping.fromJS(data, {}, this.selected().LookupItems);
        });
    }
}

class LookupVM {
    ID: number;
    Name: string;
    DisplayName: string;
    Description: string;
    LookupItems: KnockoutObservableArray<LookupItemVM>;

    constructor(ID?: number, Name?: string, DisplayName?: string, Description?: string) {
        this.ID = ID;
        this.Name = Name;
        this.DisplayName = DisplayName;
        this.Description = Description;
        this.LookupItems = ko.observableArray([]);
    }
}
selected的ID属性将显示某个敲除函数的文本。它应该是一个数字。我还尝试将ID作为数字类型传递到getListItems中,但它仍然作为函数文本传递

我错过了什么

更新


我已将此.selected().ID更改为此.selected().ID(),以考虑可观察对象。我还采纳了Mark的建议,将LookupVM属性更改为Observable。

默认情况下,敲除映射插件将在它创建为Observable的对象中创建所有属性(这是您看到的值的“函数”)。因此,这一行:

ko.mapping.fromJS(data, {}, this.lookups);
创建一个
LookupVM
数组,其中每个属性都是可观察的。类定义中指定的TypeScript类型将被忽略,因为它们在运行时不存在

这可能就是你想要的——在这种情况下,只需将你的属性更改为可观察的,例如

class LookupVM {
    ID: KnockoutObservable<number>;
    Name: KnockoutObservable<string>;
    etc.

在这种情况下,我不确定您希望如何处理
LookupItems
属性-您可能希望检查。

这似乎没有帮助,但它确实似乎是更好的代码。我刚刚注意到,如果在即时窗口中执行此操作。selected().ID(),我会得到正确的结果。@kettch您更改了什么?您应该在代码中使用
this.selected().ID()
,如我的回答所述,因为ID是可观察的。我按照您的建议将LookupVM属性更改为可观察的,并将this.selected().ID更改为this.selected().ID()。它仍然返回可观察值而不是value.nvm,我认为浏览器的缓存很奇怪。它现在似乎工作得很好。谢谢@凯奇呸,这是一种解脱,否则它会真的很奇怪!我数不清浏览器缓存咬了我多少次!
class LookupVM {
    ID: KnockoutObservable<number>;
    Name: KnockoutObservable<string>;
    etc.
ko.mapping.fromJS(data, {"copy":["ID","Name","DisplayName","Description"]}, this.lookups);