KnockoutJS - таблица не обновляется при обновлении массива - PullRequest
0 голосов
/ 29 марта 2012

Я создал пример проблемы здесь:

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>

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

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

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

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

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

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

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

0 голосов
/ 29 марта 2012

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

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

Конечно, я не должен применять привязки каждый раз, когда меняются мои данные?

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

...