我正在使用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项目,所以如果我能以更好的方式做任何事情,请告诉我:))
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:2)
observables是函数,所以即使它们的实际值为null,在查看observable本身时它仍然是真实的。
if
绑定将解包您计算的observable,但是您的将有两个级别需要解包才能获得实际值(计算的然后是实际的可观察值)。
您希望返回self.Parent()
以使其以您想要的方式运行。如果您真的想要一个真/假值(if
不需要),那么您可以!!self.Parent()
。
更新:
问题在于,映射插件仅在最外层属性上创建了可观察对象,因此Title
和Url
将是可观察的,而不是Parent
。如果您希望计算的observable实际响应在null和填充之间移动的Parent,那么它将需要是可观察的。
答案 1 :(得分:0)
父母不是一个可观察者;这是一个对象。 HasParent永远不会被重新评估,因为它不依赖于任何可观察的。将绑定从if: HasParent
更改为if: Parent
可以帮助您解决问题。