Ich versuche, einen grundlegenden Login-Bildschirm zu erstellen, wie ich Knockout und TypeScript lernen. Ich versuche, eine "PageMode" -Enumerierung hinzuzufügen, die es knockout ermöglicht zu wissen, in welchem Modus wir uns befinden, und Daten an die pageMode -Eigenschaft binden, um die Dinge korrekt anzuzeigen. Wenn der Bildschirm geladen wird, ist 'pageMode' jedoch nicht definiert. Wie kann ich das zur Arbeit bringen?Verwenden von ENUM mit Typescript und Knockout
Ich habe 2 Modelle erstellt, die von dem Knockout View Model (Anmelden und Registrieren) und einer Enum für PageMode verwendet werden.
In Entwurfszeit ist PageMode sichtbar - aber wenn ich es ausführe, schlägt es fehl, da pageMode nicht definiert ist.
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());
Auf der HTML-Seite, ich habe gehofft, dass divs sichtbar über das machen:
<div id="register-box" data-bind="visible: pageMode() == PageMode.Registering">
jedoch, dass auch ein Problem sein könnte, da ich nicht glaube, die Seite über das wissen enum?
. Diese Änderung, die Sie vorgeschlagen haben, ergibt einen Konstruktionszeitfehler. Sollte es nicht eher pageMode sein: KnockoutObservable = ko.observable (); ? –
Craig
Das sollte definitiv auch funktionieren. Soweit ich weiß, würde Typescript-Typ-Schlussfolgerung die Deklaration unnötig machen –