Javascript 将枚举与Typescript和Knockout一起使用
我正在尝试创建一个基本的登录屏幕,因为我学习了Knockout和TypeScript。我正在尝试添加一个“PageMode”枚举,它允许knockout知道我们处于什么模式,并将数据绑定到PageMode属性以正确显示内容。但是,当屏幕加载时,“pageMode”未定义。我怎样才能让它工作 我已经创建了两个模型,将由淘汰视图模型登录和注册使用,以及一个用于PageMode的枚举 在设计时,pageMode是可见的,但当我运行它时,它会失败,因为pageMode未定义Javascript 将枚举与Typescript和Knockout一起使用,javascript,typescript,knockout.js,enums,Javascript,Typescript,Knockout.js,Enums,我正在尝试创建一个基本的登录屏幕,因为我学习了Knockout和TypeScript。我正在尝试添加一个“PageMode”枚举,它允许knockout知道我们处于什么模式,并将数据绑定到PageMode属性以正确显示内容。但是,当屏幕加载时,“pageMode”未定义。我怎样才能让它工作 我已经创建了两个模型,将由淘汰视图模型登录和注册使用,以及一个用于PageMode的枚举 在设计时,pageMode是可见的,但当我运行它时,它会失败,因为pageMode未定义 class LoginMod
class LoginModel {
emailAddress: KnockoutObservable<string>;
password: KnockoutObservable<string>;
rememberMe: KnockoutObservable<boolean>;
constructor() {
this.emailAddress = ko.observable("");
this.password = ko.observable("");
this.rememberMe = ko.observable(false);
}
}
class RegisterModel {
emailAddress: KnockoutObservable<string>;
password: KnockoutObservable<string>;
passwordRetry: KnockoutObservable<string>;
constructor() {
this.emailAddress = ko.observable("");
this.password = ko.observable("");
this.passwordRetry = ko.observable("");
}
}
enum PageMode {
LoggingIn,
RecoveringPassword,
Registering
}
class ForgotPassword {
emailAddress: KnockoutObservable<string>;
}
class HomeViewModel {
login: LoginModel;
register: RegisterModel;
pageMode: KnockoutObservable<PageMode>;
isLoginEnabled: KnockoutComputed<boolean>;
constructor() {
this.pageMode(PageMode.LoggingIn);
this.login = new LoginModel();
this.register = new RegisterModel();
this.isLoginEnabled = ko.computed(() => {
return !!this.login.emailAddress() && !!this.login.password();
});
}
ShowRecoverPassword()
{
this.pageMode(PageMode.RecoveringPassword);
}
ShowRegister()
{
this.pageMode(PageMode.Registering);
}
ShowLogin()
{
this.pageMode(PageMode.LoggingIn);
}
}
ko.applyBindings(new HomeViewModel());
在HTML方面,我希望通过以下方式使div可见:
<div id="register-box" data-bind="visible: pageMode() == PageMode.Registering">
但是,这也可能是一个问题,因为我认为页面不会知道枚举?这确实有效。未定义错误“pageMode”源于未在HomeViewModel上实例化pageMode 所以改变
pageMode: KnockoutObservable<PageMode>;
登录
登记
显示寄存器这确实有效。未定义错误“pageMode”源于未在HomeViewModel上实例化pageMode 所以改变
pageMode: KnockoutObservable<PageMode>;
登录
登记
Show register敲除绑定可以访问viewmodel上的属性、全局变量和绑定上下文的属性。因此,一个简单的解决方案是确保枚举全局存储:
window.PageMode = PageMode;
敲除绑定可以访问viewmodel上的属性、全局变量和绑定上下文的属性。因此,一个简单的解决方案是确保枚举全局存储:
window.PageMode = PageMode;
. 您建议的更改会导致设计时错误。它是否应该是pageMode:KnockoutObservable=ko.observable?这肯定也行。据我所知,Typescript的类型推断会使声明变得不必要。您建议的更改会导致设计时错误。它是否应该是pageMode:KnockoutObservable=ko.observable?这肯定也行。据我所知,Typescript的类型推断会使声明变得不必要。我不得不使用window['PageMode']=PageMode来避开TS的抱怨,但它是有效的。谢谢我不得不使用window['PageMode']=PageMode来绕开TS的呻吟,但它可以工作。谢谢