【问题标题】:Knockout loses binding to internal observables when parent object is set to null当父对象设置为 null 时,Knockout 失去与内部可观察对象的绑定
【发布时间】:2013-01-08 19:35:07
【问题描述】:

这是我今天遇到的问题,我想知道这是我做错了什么还是 Knockout 中的错误。

假设有 3 种不同的视图模型状态来自服务器:

State 1 = { AnObject: { WithString: "SomeText" } }
State 2 = { AnObject: null }
State 3 = { AnObject: { WithString: "DifferentText" } }

如果我这样做:

<p data-bind="text: AnObject.WithString"></p>

假设适当的 Knockout 绑定,我希望该元素的文本是“SomeText”,然后什么都没有,然后是“DifferentText”,作为通过所有三个状态更新我的 KO 视图模型。

实际发生的是第一个状态工作正常(文本变为“SomeText”),然后在第二个状态下,文本没有改变,似乎绑定完全丢失了,因为在第三个状态下,文本仍然没有改变,即使现在有很好的使用价值。

这是一个演示问题的 JSFiddle:

http://jsfiddle.net/zAuDs/4/

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin knockout-2.0


    【解决方案1】:

    我相信这是映射插件如何处理更新的产物。

    在第一次映射时,会为 InternalThing 创建一个 observable。

    在第二个映射中,整个 observable 从视图模型中移除(UI 仍然绑定到它)。

    在第三个映射中,为 InternalThing 创建了一个新的 observable,它没有绑定到 UI。

    一种选择是强制 Obj 可观察并在您的元素周围使用 with: Obj

      var ViewModel = function(data) {
          var me = this;
          ko.mapping.fromJS(data, {}, me);
          me.Obj = ko.observable(me.Obj);   
    
          return me;
      };
    

    然后,像这样绑定:

    <!-- ko with: Obj -->
    <h1 data-bind="text: InternalThing">1</h1>
    <!-- /ko -->
    

    示例:http://jsfiddle.net/rniemeyer/bJkKp/

    【讨论】:

    • 有趣。这确实有效,没有其他人提供答案。我最终只是稍微改变了我的模型来解决这个问题,但我会接受这是一个很好的答案。
    • RPN 的另一个非常有用的答案。使用工作/CDN KO 参考和一些额外信息更新了 jsfiddle。 jsfiddle.net/bJkKp/3
    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多