0

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

该对象的片段如下:

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

如果Parent.Title发生更改,那么我页面上的所有内容都会按预期更新,但是当Parent变为 null 时,我遇到了问题。使用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 项目,所以如果我能以更好的方式做任何事情,请告诉我 :)

任何帮助,将不胜感激。

谢谢。

4

2 回答 2

2

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

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

你会想要返回self.Parent()让它以你想要的方式工作。如果你真的想要一个真/假值(不需要if),那么你可以做!!self.Parent()

更新:

问题是映射插件只在最外层的属性上创建 observables,所以TitleandUrl将是 observables,但不是Parent. 如果您希望计算出的 observable 实际响应在 null 和填充之间移动的 Parent,那么它需要是 observable 的。

于 2012-05-02T13:32:25.260 回答
0

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

于 2012-05-02T21:07:09.823 回答