【问题标题】:Computed value always returning a true-ish value even when parent property is null即使父属性为空,计算值也始终返回真值
【发布时间】:2012-05-02 05:24:01
【问题描述】:

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

对象的sn-p如下:

{ 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 项目,所以如果我能以更好的方式做任何事情,请告诉我:)

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: knockout.js computed-observable


    【解决方案1】:

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

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

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

    更新:

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

    【讨论】:

    • 感谢您的帮助。但是,如果我返回 self.Parent(),我会收到一条错误消息,说 self.Parent 在 self.Parent 不为空的情况下不是函数。我没有正确绑定属性吗?
    • 也许我们可以为这个找到一个 jsFiddle ?您是否曾经直接设置父级(self.Parent = someObject 而不是self.Parent(someObject))。了解您如何更新对象并调用映射插件可能会有所帮助。
    • 问题是映射插件只在最外层的属性上创建可观察对象,所以TitleUrl 将是可观察对象,而不是Parent。如果您希望计算出的 observable 真正响应在 null 和填充之间移动的 Parent,那么它需要是 observable 的。
    • 没错,Title 和 Url 是 observables。据我所知,我需要像你和@Michael Best 所说的那样让 Parent 成为一个可观察的对象?然后在标记中使用 Parent().Title?我没有直接设置任何属性,我让映射插件处理它,因为我正在传递 JS 对象,例如 ko.mapping.fromJS(data, model);
    • 是的,没错。一种选择是使用 create 回调使 Parent 成为 observable。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多