Нокаут с картографированием.fromJS и шаблон


У меня есть таблица, обновляемая с каждой записью в моей модели, и два события, запускаемые при удалении и добавлении в массив. hideElement вызывает функцию jquery "fadeOut", а showElement-функцию jquery" fadeIn", чтобы создать отличный эффект затухания/затухания.

<tbody  data-bind='template: { foreach: entries,
     beforeRemove: hideElement,
     afterAdd: showElement }'>

Моя модель выглядит так:

var Model = function() {
self.entries = ko.mapping.fromJS([]);
this.getData = function() {
$.ajax({
    url: "/test",
    type: "GET",
    success: function(response) {
        ko.mapping.fromJS(response, self.entries);
...

this.showElement = function(elem) { 
    if(elem.nodeName == "TR") {
         $(elem).fadeIn(500);
    }
};

this.hideElement = function(elem) { 
    if(elem.nodeName == "TR") {
       $(elem).fadeOut(500);
    };
};
...
Проблема в том, что каждый раз, когда ko.mapping.fromJS(response, self.entries) вызывается в ответе ajax, кажется, что knockout удаляет/добавляет записи, даже если они точно такие же. Из-за этого ... вызывается showElement / hideElement, и элементы в моей таблице "мигают", так как они удаляются/добавляются каждый вызов ajax.

Предполагается, что это так или я использую его неправильно?

1 2

1 ответ:

Вам нужно использовать опцию key в плагине mapping, чтобы плагин знал, какие элементы совпадают

Http://jsfiddle.net/yWwfz/

var mapping =  {
    items: {
        key: function(item) { return item.id; }
    }
};
ko.mapping.fromJS(data, mapping, this);