2012-03-29 6 views
0

Я создал пример проблемы здесь:KnockoutJS - таблица не обновляется, когда массив обновляется

http://jsfiddle.net/JustinN/qWeLT/1/

Мой реальный код подключен к веб-метод ASP.NET, так что пример кода был настроен на то, чтобы продемонстрировать публичную веб-службу.

В принципе, у меня есть массив, к которому я привязываюсь, однако после вызова ajax в таблице не отображается обновленная информация. Я не уверен, что мне не хватает, я подумал, что сначала мне нужен плагин для сопоставления, поэтому я пробовал это, но я все равно ничего не получаю.

Неужели я не должен применять приложения каждый раз, когда меняют данные?

[EDIT]

JavaScript ниже:

var ViewModel = function() { 
var self = this; 
self.items = ko.observableArray([]); 
self.refresh = function() { 
    $.ajax({ 
     type: "POST", 
     url: "http://api.wipmania.com/json", 
     data: "{}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (data) { 
      ko.mapping.fromJS(data.d, self.items.address); 
     } 
    }); 
}; 
} 

var viewModel = new ViewModel(); 
$(function() { 
ko.applyBindings(viewModel); 
viewModel.refresh(); 
}); 

HTML ниже:

<table data-bind="visible:items.length > 0"> 
<thead> 
    <tr> 
     <th>Country</th> 
     <th>Code</th> 
    </tr> 
</thead> 
<tbody data-bind="foreach: items"> 
    <tr> 
     <td data-bind="text:country"></td> 
     <td data-bind="text:country_code"></td> 
    </tr> 
</tbody> 
</table> 
+0

Извините, что я использовал для вставки моего кода, но затем все время спрашивали о примерах JSFiddle. Теперь я включу оба. - Отредактировано и исправлено. – JustinN

+0

Зачем у вас '.address' в этой строке? 'ko.mapping.fromJS (data.d, self.items.address);' – Niko

+0

Хорошая сделка. Да, копия и вставка лучше всего (поразительно, как часто люди перепечатывают, а затем вводят несвязанные ошибки!) и живые ссылки в качестве дополнения * (я предпочитаю http://jsbin.com, но это вопрос вкуса) великолепны. –

ответ

2

Проверить эту скрипку: http://jsfiddle.net/Gm7zH/1/

Прежде всего я использую поддельные данные АЯКС из-за запроса перекрестного домена. Это данные, которые я получил с вашего сервера. И используя setTimeout для имитации асинхронного запроса.

Затем вы делаете ряд ошибок:

Вы пытаетесь сопоставить свойству адрес массива, который не существует. Во-вторых, адрес вашего результата - это просто объект, поэтому я переношу его в массив, чтобы он работал.

Затем вы пытаетесь сопоставить существующий наблюдаемый массив, но поставляя массив в качестве второго аргумента, второй аргумент - параметры сопоставления, третий - правильное место для этого. Я передаю null в качестве параметров отображения в моем примере.

Наконец, для отображения таблицы вы указываете items.length> 0. То, что вы хотите, это items(). Length> 0, которая является длиной базового массива.

+0

Спасибо, Мартин за исправленный пример и пример, я использовал это, чтобы исправить свой код, и он отлично работает сейчас! Приношу свои извинения всем за ужасный пример, который я опубликовал с моим первоначальным вопросом, я попытаюсь представить более четкие образцы в будущем. – JustinN

0

Ваш массив self.items, но ваш Аякса success вызов обновления self.items.address, который я угадывание есть undefined. Таким образом, модуль плагина создает модель , не относящуюся к оригиналу.

(Вы не показали, что data.d выглядит, но я предполагаю, что это массив.)

Конечно, я не имел в виду, чтобы applyBindings каждый раз, когда изменения мои данные?

Исправить. Вы делаете это один раз, затем обновление наблюдаемых должно (все хорошо) обновлять DOM.

+0

Похоже, что мой пример, который я взбивал, чтобы продемонстрировать свою проблему, имеет ряд проблем, связанных с этим. Ошибка .address должна быть на data.d.address, а не на self.items - извинения за путаницу, однако проблемы, к сожалению, нет. – JustinN

Смежные вопросы