【问题标题】:Knockout Mapping data bind not working淘汰赛映射数据绑定不起作用
【发布时间】:2015-02-10 10:17:30
【问题描述】:

我正在使用最新的 KO 映射插件。这个想法是详细信息部分应该填充从 Ajax 调用中检索到的 JSON 数据。

var supervisorVM = {
        supervisor: ko.observable()
    };

-----------code to call custom data service which returns JSON---
     if (supervisorDetails) {
        $('#Detail').show();
        supervisorVM.supervisor = ko.mapping.fromJS(supervisorDetails);
        ko.applyBindings(supervisorVM, document.getElementById("Detail"));
    }



<div id="Detail" class="side-widget" style="display:none">
    <h2>Details</h2>
    <strong>
        Supervisor<br>
        <span data-bind="text: supervisor.FullName"></span><br/>
    </strong>
    <span data-bind="text: supervisor.PhoneNumber"></span><br/>
    <a data-bind="text: supervisor.Email, attr: { href : 'mailto:'+supervisor.Email() }"></a>
</div>

每次我运行“详细信息”部分时,都不会填充主管详细信息,即全名和电话号码。

我调试并确认 supervisorVM.supervisor 已填充,但数据绑定不起作用。

下面也试过了,没有运气:

supervisorVM.supervisor(ko.mapping.fromJS(supervisorDetails));

我已经花了 2 个多小时了,有人可以帮忙看看我做错了什么吗?

谢谢。

【问题讨论】:

  • 对我来说它工作正常,请查看jsfiddle.net/supercool/74dh736s/16。如果您可以在小提琴中重现该问题,则很容易解决。
  • 您进行查询调用以显示 Detail div 而不是使用布尔可观察对象以及将绑定如此专门应用于 DOM 元素的事实使我认为您没有正确使用敲除这可能是你大部分挣扎背后的原因。

标签: knockout.js


【解决方案1】:

您的绑定(例如 supervisor.Fullname)定义不正确 - 您正在可观察函数上寻找属性“全名”。应该是supervisor().Fullname

尝试将字段包装在 with: supervisor 绑定中。只要您的 AJAX 调用未返回并将内容添加到 supervisor,这具有不会呈现字段的良好副作用:

<div id="Detail" class="side-widget" style="display:none" data-bind="with: supervisor">
    <h2>Details</h2>
    <strong>
        Supervisor<br>
        <span data-bind="text: FullName"></span><br/>
    </strong>
    <span data-bind="text: PhoneNumber"></span><br/>
    <a data-bind="text: Email, attr: { href : 'mailto:' + Email() }"></a>
</div>

另外,不要像这里那样替换 observables:

supervisorVM.supervisor = ko.mapping.fromJS(supervisorDetails);

改为替换它们的内容

supervisorVM.supervisor( ko.mapping.fromJS(supervisorDetails) );

您的标记已经与您分配给supervisor: ko.observable() 的旧可观察对象绑定。你可以用一个新的 observable 替换那个 observable,但是你的标记仍然绑定到旧的——它永远不会再更新了。

【讨论】:

  • defined incorrectly 实际上这是正确的方法(基于他的代码),因为他不是 pushing 可观察的数据,他正在分配 = 。好吧,如果他需要使用() 以您的方式(首选方式),他必须像这样实现:jsfiddle.net/supercool/74dh736s/17
  • 当你用新的 observable 替换绑定在某处的 observable 时,该绑定将不再更新。感谢您的提醒-我将在答案中包含该部分。
  • 实际上他的代码工作正常,你可以检查我的评论,上面附有小提琴。
  • 我检查了你的小提琴,你正在分配数据,而不是替换 observable? supervisorVM.supervisor(data);。无论如何,这并不重要——替换 observables 是一种非常糟糕的做法,会导致很难追踪的错误,所以我强烈建议一开始就不要这样做。
  • 是的,因为您在绑定之前分配了它。这不是在数据更改之后绑定时会发生的情况:fiddle.
猜你喜欢
  • 2014-03-26
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2012-09-05
  • 2012-12-04
  • 2014-01-10
相关资源
最近更新 更多