2

我在尝试使用映射插件将项目更新为 observableArray 的一部分时遇到问题。

我有以下代码

accounts.list = ko.mapping.fromJS(@(Html.Raw(Model.AccountsJSON)));

我有这个绑定到一个表使用

<tbody data-bind="foreach: list"> ... </tbody>

这一切正常,然后我有以下功能

$('#datatable').delegate(".cancelLock", "click", function() {
        var item = ko.contextFor(this).$data;
        var param = {AccountNumber : item.AccountNumber()}
        $.post('@Url.Action("cancellock","accounts")',param,function(result){
            ko.mapping.fromJSON(result,item);
            if(accounts.lockeditem() == item){
                accounts.lockeditem(0);
            }
        });
    });

该行ko.mapping.fromJSON(result,item);不会导致错误,并且函数继续,但是它不会导致可观察的更新。

我已经尝试将代码更改为ko.mapping.fromJSON(result,accounts.list);(并更新我的控制器以返回完整列表)并且这可以正常工作 - 问题是我不想更新整个表,我“只是”想要恢复“项目”回到原来的状态。

我也尝试过使用item.Updated(result.Updated);(其中更新是对象的属性之一),这可以按预期工作,但是我宁愿不要在每个属性上手动调用它,除非我必须这样做。

是否可以使用ko.mapping.fromJSON(result,item);(或某些变体)?我在做一些愚蠢的错误吗?

提前致谢。

4

2 回答 2

4

除非我误解了您的意图,否则您可以使用“指定更新目标”下的映射文档ko.mapping.fromJS中提到的(或 fromJSON)变体来执行此操作。所以我想你想要这个:

ko.mapping.fromJSON(result, {}, item); 

这是一个小提琴:http: //jsfiddle.net/kR4jc/

于 2012-07-30T20:14:05.397 回答
0

我更新了小提琴以引用 rawgithub.com 和最新的 knockout.js 文件。

http://jsfiddle.net/kR4jc/5/

https://rawgithub.com/SteveSanderson/knockout.mapping/master/build/output/knockout.mapping-latest.debug.js
http://knockoutjs.com/downloads/knockout-2.2.1.js

这篇文章也帮助了我 https://github.com/SteveSanderson/knockout.mapping/issues/41

于 2013-06-07T16:49:49.820 回答