在this question与我的问题挣扎后,我发现我可以初始化可观察到的一个空的对象是这样的:初始化所有ko.observables会伤害吗?
abc = ko.observable({});
旧的智慧,从Fortran语言等回来,有它,你应该总是初始化变量,所以我现在倾向于初始化所有ko.observables。这不是我在淘汰赛网站的教程中阅读的内容。所以我的问题是:我是否应该只在需要的地方进行初始化,或者如果我在任何地方都做到这一点,性能是否会降低?
在this question与我的问题挣扎后,我发现我可以初始化可观察到的一个空的对象是这样的:初始化所有ko.observables会伤害吗?
abc = ko.observable({});
旧的智慧,从Fortran语言等回来,有它,你应该总是初始化变量,所以我现在倾向于初始化所有ko.observables。这不是我在淘汰赛网站的教程中阅读的内容。所以我的问题是:我是否应该只在需要的地方进行初始化,或者如果我在任何地方都做到这一点,性能是否会降低?
我不认为你应该担心表现。你应该担心可读代码,有意义的初始值和没有错误的代码。
通常,您会看到使用默认值使开发人员的生活更轻松。例如:
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,从而最大限度地减少您在其他问题中遇到的错误种类。
注意:我不确定这个回答是否太过于基于观点...如果您觉得这是回答,请告诉我。问题可能是脱离主题/太宽的栈式...
我认为这是一个很好的答案。而一个人的例子是一个很好的例子 - 如果没有人选择,用空对象初始化它没有任何意义 - 那么你就需要检查属性是否存在。最好是“没有”,即表示没有选择的“空”。在其他情况下,拥有默认值可能会有用。这实际上取决于用例,但我不会说“是的,这是一个好主意来初始化你的可观察性”。 –
我发现我提出的初始化并不总是有用或足够的。无论如何,感谢你的回答,我明天会研究它。 – Roland
你的回答肯定帮助我更好地理解Knockout的可能性,以及什么不是,以及如何处理空值。 – Roland