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);