初始化所有ko.observables会不会有害?

时间:2017-02-22 16:18:44

标签: knockout.js

this question中遇到问题之后,我发现我可以用这样的空对象初始化一个observable:

abc = ko.observable({});

旧的智慧,从Fortran等回来,你应该总是初始化你的变量,所以我现在倾向于初始化所有ko.observables。这不是我在淘汰赛网站上的教程中读到的内容。所以我的问题是:我应该只在严格需要的地方初始化,或者如果我到处都没有性能下降?

1 个答案:

答案 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,问题可能偏离主题/过于宽泛......