更新ViewModel后,Knockout不更新UI

时间:2013-07-08 15:38:02

标签: knockout.js

我有一个绑定到我的UI的ViewModel

<div class="editor-label-medium-bold">
    <div data-bind="text: 'Cancellation Amount'"></div>
</div>
<div class="editor-field-short">
    <div id="CancellationAmount" data-bind="text: CancellationAmount"></div>
</div>

当调用ko.applyBindings(xxx)时,CancellationAmount的值会显示。到目前为止一切都很好。

我有一个JQueryUI日期选择器,并且在日期更改后,我得到了取消金额的更新数字。这会得到正确的价值。

$.ajax({
    dataType: "json",
    method: "GET",
    url: '@Url.Action(MVC.XYZ.ActionNames.GetCancellationAmount, MVC.XYZ.Name)',
    data: { date: mdl.CancelDate(), policyid: '@ViewBag.PolicyID' }
})
.done(function (response) {
    mdl.CancellationAmount = ko.observable(response);
    $('#CancellationAmount').val(response);
})
.fail(function (response) {
    alert('fail');
});

“完成”回调中的两行都没有更新UI。我用Chrome测试了这个,在控制台中,mdl.CancellationAmount()返回正确的数字,但UI不会让步。

我即将取消绑定此字段并使用JQuery手动更新它,就像我尝试“完成”回调的第二行一样。我认为因为该字段是绑定的,淘汰会阻止JQuery(可能是其他任何东西......)来更新它。

我应该提一下这行代码:

mdl.CancellationAmount = ko.observable(mdl.AnnualPremium());

在初始加载时,我的服务器模型为CancellationAmount发送null,所以我将另一个值复制到它,这是一个正十进制数字,但我打开它,所以不要认为这是问题。这一行就在ko.applyBindings(xxx)

之前

有没有人见过这个,或者知道如何克服这个问题?

1 个答案:

答案 0 :(得分:4)

您以错误的方式将数据分配给mdl.CancellationAmount。它已经是可观察的,所以你应该使用()在done函数中赋值。重写你的回调如下:

.done(function (response) {
    mdl.CancellationAmount(response);
})