выбить плагин сопоставления, обновляющий один элемент в массиве

У меня проблема с попыткой обновить элемент как часть 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); (где update является одним из свойств объекта), и это работает, как и ожидалось, однако я бы предпочел не вызывать это вручную для каждого свойства, если мне это не нужно.

можно ли использовать ko.mapping.fromJSON(result,item); (или какой-то вариант)? Я делаю что-то глупо неправильно?

Заранее спасибо.


person Brett Smith    schedule 28.07.2012    source источник


Ответы (2)


Если я неправильно понял ваше намерение, вы можете сделать это, используя вариант ko.mapping.fromJS (или fromJSON), упомянутый в сопоставление документов в разделе «Указание цели обновления». Итак, я думаю, вы хотите этого:

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

Вот скрипт: http://jsfiddle.net/kR4jc/

person antishok    schedule 30.07.2012
comment
Спасибо - верите или нет, я на самом деле пробовал это раньше - кажется, у меня была проблема, которая влияла на это - person Brett Smith; 31.07.2012

Я обновил скрипку, указав ссылку на 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

person TWilly    schedule 07.06.2013