2017-02-22 16 views
2

this questionに私の問題で苦労した後、私はこのような空のオブジェクトで観察を初期化することを見出し:バックのFortranからすべてのko.observablesを初期化するのは苦労でしょうか?

abc = ko.observable({}); 

旧知恵など、あなたは常にあなたの変数を初期化する必要があること、それを持っていますですから、私は今すべてのko.observablesを初期化する傾向があります。これは私がノックアウトサイトのチュートリアルで読んだものではありません。だから私の質問です:私はどこに厳密に必要な初期化する必要がありますか、私はそれがどこでもそれを行う場合、パフォーマンスの低下はありません?

答えて

4

パフォーマンスについて心配する必要はありません。読み込み可能なコード、意味のある初期値、バグのないコードについては心配する必要があります。

多くの場合、開発者の生活を楽にするためにデフォルト値が使用されています。たとえば、次のように空の文字列で初期化

this.userInput = ko.observable(""); 
this.upperCaseUserInput = ko.computed(function() { 
    return this.userInput().toUpperCase(); 
}, this); 

は、私たちは私たちの計算でnull/undefinedチェックをスキップすることができます。 valueバインディングを使用してinputにバインドすることがわかっている場合は、ほぼと入力してください。入力のプロトタイプに常にtoUpperCaseメソッドがあることを確認してください。空のオブジェクトでuserInputを初期化すると、ここではうまくいきません。toUpperCaseという名前の関数がないとエラーが発生します。

複雑な計算式や「nullable」オブザーバブルを扱っている場合は、nullチェックを計算に入れ、可能であれば「階層化」/安全な計算を導入するのが最善の方法だと思います。例:

this.selectedPerson = ko.observable(); // Can be null, undefined or Person 

// This computed is *always* a string 
var fullName = ko.pureComputed(function() { 
    var person = this.selectedPerson(); 

    return person 
    ? person.firstName + " " + person.lastName 
    : "Unknown person"; 
}, this); 

// So in this computed, we don't have to do any null checks 
this.displayName = ko.pureComputed(function() { 
    return "**" + fullName() + "**"; 
}, this); 

絶対的な型安全性が必要な場合は、TypeScriptを調べることをおすすめします。 TypeScriptノックアウトの組み合わせでは、特定のタイプの値のみを含むオブザーバブルを定義し、他の質問で直面していたエラーの種類を最小限に抑えることができます。

注:この回答があまりにも意見に基づいているかどうかわかりません...あなたがそれが気になるなら、私に教えてください。質問は、トピックオーバー/ストリームオーバーフローのために広すぎるかもしれません...

+0

これは良い答えだと思います。そして、人の例は良いものです - 誰も選択されていなければ、それを空のオブジェクトで初期化するのは意味がありません - プロパティが存在するかどうかをチェックする必要があります。何も選択されていないことを示す「無」すなわち「ヌル」を持つ方がよい。それ以外の場合は、デフォルト値を使用すると便利です。それは実際にユースケースに依存しますが、私は「はい、あなたのオブザーバブルを初期化することをお勧めします」とは言いません。 –

+0

私が提案した初期化は、必ずしも有用ではないとわかった。とにかくあなたの答えをありがとう、私は明日それを勉強します。 – Roland

+0

あなたの答えは、ノックアウトで可能なことと何ができないのか、そしてヌル値を扱う方法をよりよく理解するのに役立ちました。 – Roland

関連する問題