即使parent属性为null,计算值也始终返回true-ish值

时间:2012-05-02 05:24:01

标签: knockout.js computed-observable

我正在使用ko映射插件从JS对象ko.mapping.fromJS()创建我的observable。

该对象的片段如下:

{ Name: "blah", Parent: { Title: "blah", Url: "/blah" } }

如果Parent.Title发生了变化,那么我网页上的所有内容都会按预期更新,但当Parent变为空时我遇到了问题。使用Parent属性的简化标记如下所示:

<p data-bind="if: HasParent">Up: <a data-bind="text: ParentTitle"></a></p>

HasParent看起来像这样:

self.HasParent = ko.computed(function () {
    return self.Parent;
});

ParentTitle看起来像这样:

self.ParentTitle = ko.computed(function () {
    return self.HasParent() ? self.Parent.Title() : "";
});

注意:self已设置为ko.mapping.fromJS()的结果,然后通过调用ko.applyBindings();

应用于该页面

所以基本上我的问题是HasParent函数总是返回一个真值。

另外,这是我的第一个ko项目,所以如果我能以更好的方式做任何事情,请告诉我:))

任何帮助都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:2)

observables是函数,所以即使它们的实际值为null,在查看observable本身时它仍然是真实的。

if绑定将解包您计算的observable,但是您的将有两个级别需要解包才能获得实际值(计算的然后是实际的可观察值)。

您希望返回self.Parent()以使其以您想要的方式运行。如果您真的想要一个真/假值(if不需要),那么您可以!!self.Parent()

更新:

问题在于,映射插件仅在最外层属性上创建了可观察对象,因此TitleUrl将是可观察的,而不是Parent。如果您希望计算的observable实际响应在null和填充之间移动的Parent,那么它将需要是可观察的。

答案 1 :(得分:0)

父母不是一个可观察者;这是一个对象。 HasParent永远不会被重新评估,因为它不依赖于任何可观察的。将绑定从if: HasParent更改为if: Parent可以帮助您解决问题。