2017-02-22 112 views
2

this question與我的問題掙扎後,我發現我可以初始化可觀察到的一個空的對象是這樣的:初始化所有ko.observables會傷害嗎?

abc = ko.observable({}); 

舊的智慧,從Fortran語言等回來,有它,你應該總是初始化變量,所以我現在傾向於初始化所有ko.observables。這不是我在淘汰賽網站的教程中閱讀的內容。所以我的問題是:我是否應該只在需要的地方進行初始化,或者如果我在任何地方都做到這一點,性能是否會降低?

回答

4

我不認爲你應該擔心表現。你應該擔心可讀代碼,有意義的初始值和沒有錯誤的代碼。

通常,您會看到使用默認值使開發人員的生活更輕鬆。例如:

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

爲空字符串初始化讓我們跳過我們計算出的null/undefined檢查。如果我們知道我們將通過value綁定綁定到input,我們可以差不多請確保我們輸入的原型中始終存在toUpperCase方法。用空對象初始化userInput在這裏不會有什麼好處:缺少名爲toUpperCase的函數會引發錯誤。

如果您正在處理複雜的計算結果和「可空」的可觀察量,我認爲最好的方法是在您的計算中包含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-knockout組合將允許您定義只能包含特定類型值的observables,從而最大限度地減少您在其他問題中遇到的錯誤種類。

注意:我不確定這個回答是否太過於基於觀點...如果您覺得這是回答,請告訴我。問題可能是脫離主題/太寬的棧式...

+0

我認爲這是一個很好的答案。而一個人的例子是一個很好的例子 - 如果沒有人選擇,用空對象初始化它沒有任何意義 - 那麼你就需要檢查屬性是否存在。最好是「沒有」,即表示沒有選擇的「空」。在其他情況下,擁有默認值可能會有用。這實際上取決於用例,但我不會說「是的,這是一個好主意來初始化你的可觀察性」。 –

+0

我發現我提出的初始化並不總是有用或足夠的。無論如何,感謝你的回答,我明天會研究它。 – Roland

+0

你的回答肯定幫助我更好地理解Knockout的可能性,以及什麼不是,以及如何處理空值。 – Roland