Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将枚举与Typescript和Knockout一起使用_Javascript_Typescript_Knockout.js_Enums - Fatal编程技术网

Javascript 将枚举与Typescript和Knockout一起使用

Javascript 将枚举与Typescript和Knockout一起使用,javascript,typescript,knockout.js,enums,Javascript,Typescript,Knockout.js,Enums,我正在尝试创建一个基本的登录屏幕,因为我学习了Knockout和TypeScript。我正在尝试添加一个“PageMode”枚举,它允许knockout知道我们处于什么模式,并将数据绑定到PageMode属性以正确显示内容。但是,当屏幕加载时,“pageMode”未定义。我怎样才能让它工作 我已经创建了两个模型,将由淘汰视图模型登录和注册使用,以及一个用于PageMode的枚举 在设计时,pageMode是可见的,但当我运行它时,它会失败,因为pageMode未定义 class LoginMod

我正在尝试创建一个基本的登录屏幕,因为我学习了Knockout和TypeScript。我正在尝试添加一个“PageMode”枚举,它允许knockout知道我们处于什么模式,并将数据绑定到PageMode属性以正确显示内容。但是,当屏幕加载时,“pageMode”未定义。我怎样才能让它工作

我已经创建了两个模型,将由淘汰视图模型登录和注册使用,以及一个用于PageMode的枚举

在设计时,pageMode是可见的,但当我运行它时,它会失败,因为pageMode未定义

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的呻吟,但它可以工作。谢谢