2017-02-22 62 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