在this question中遇到问题之后,我发现我可以用这样的空对象初始化一个observable:
abc = ko.observable({});
旧的智慧,从Fortran等回来,你应该总是初始化你的变量,所以我现在倾向于初始化所有ko.observables。这不是我在淘汰赛网站上的教程中读到的内容。所以我的问题是:我应该只在严格需要的地方初始化,或者如果我到处都没有性能下降?
答案 0 :(得分:4)
我认为你不应该担心表现。您应该担心可读代码,有意义的初始值和没有错误的代码。
通常,您会看到用于使开发人员的生活更轻松的默认值。例如:
this.userInput = ko.observable("");
this.upperCaseUserInput = ko.computed(function() {
return this.userInput().toUpperCase();
}, this);
使用空字符串初始化允许我们跳过计算中的null
/ undefined
检查。如果我们知道我们将通过input
绑定绑定到value
,我们可以几乎确保始终存在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组合允许您定义只能包含特定类型值的observable,从而最大限度地减少您在另一个问题中遇到的错误类型。
注意:我不确定这个答案是否过于基于意见......如果您有这种答案,请告诉我。对于stackoverflow,问题可能偏离主题/过于宽泛......