0

これは、私がアクティブにしている別の質問と非常によく似ていますが、別の質問として質問することもできますし、別の聴衆に役立つかもしれません.

ノックアウト検証のカスタム ルールがあります。

ko.validation.rules["sameAs"] = {
    validator: function (val, otherObservable) {
        return val === otherObservable();
    },
    message: "Value should be same as {0}, but differs"
};

生のJavaScriptでは、使用法が次のようになるため、これは正常に機能しました。

function SomeObject() {
   this.Email = ko.observable().extend({ required: true, email: true });
   this.ConfirmationEmail = ko.observable().extend({ required: true, email: true, sameAs: this.Email });
}

ただし、これを書き込もうとすると、Typescript ランドで次のようになります。

class SomeObject {
   public Email = ko.observable().extend({ required: true, email: true });
   public ConfirmationEmail = ko.observable().extend({ required: true, email: true, sameAs: this.Email });
}

エラーが表示されます:

キーワード 'this' は、クラス本体の初期化子、またはスーパー コンストラクター呼び出しでは参照できません

これは理にかなっていますが、コンストラクターなどにハックしようとしない限り、元々行っていたことをどのように行うことができるかわかりません。これにより、クラスが少し恐ろしく見えます。

4

1 に答える 1

2

書くことの欠点を見つけることができません:

class SomeObject {
    public Email = ko.observable();
    public ConfirmationEmail = ko.observable();

    constructor() {
        this.Email.extend({ required: true, email: true });
        this.ConfirmationEmail.extend({ required: true, email: true, sameAs: this.Email })
    }
}

追加の 2 行のコードを除いて。

私の意見では、コードの読みやすさは少し良くなりました。変数の型を確認するために長い行全体を読む必要はありません。この分離を行うと、コードで何が起こっているかをよりよく示すことができます。多分それは審美的なものかもしれませんが、変数宣言と「拡張」式を混在させると、特に「拡張」が非常に間違っている場合に読みにくい場合があります...拡張:) .

于 2013-03-28T13:44:18.380 に答える