«Uncaught TypeError: Невозможно обработать привязку» с KnockoutJS - PullRequest
0 голосов
/ 26 октября 2018

У меня есть этот код:

<script>
    var viewModel = {};

    $.getJSON("URL", function (data) {
        viewModel = ko.mapping.fromJS(data);
        ko.applyBindings(viewModel);
    });
</script>

Я связываю это в этом коде:

<!-- ko foreach: { data: object, as: 'object' } -->

   <div>
     ... content (with more data-bindings) ...
   </div>

<!-- /ko -->

Но я получаю эти ошибки в консоли:

Uncaught TypeError: Невозможно обработать привязку "foreach: function () {return {data: object, as: 'object'}}"

Сообщение: невозможно обработать привязку (...)

Сообщение: не удается прочитать свойство (...)

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

Я пробовал это:

var viewModel = {
    object: null
    (and other properties)
};

и это:

function viewModel() {
var self = this;
...
}

Но это не помогает. Что я делаю неправильно? Я знаю, что есть много вопросов по этому поводу, но я не могу найти ответ на мою проблему.

1 Ответ

0 голосов
/ 26 октября 2018

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

Для настройки вашего представления требуется data, полученный от сервера, для удовлетворения этого требования:

  • Должно быть объектом
  • Должен иметь свойство object
  • Значение data.object должно быть повторяемым

Т.е .: это должно работать:

ko.applyBindings({ object: [] })

Если ваши данные представляют собой массив, вам следует переписать привязку к:

<!-- ko foreach: { data: $data, as: 'object' } -->
<div>Bind to object.someProp here</div>
<!-- /ko -->

Если ваши данные являются объектом, например: { object: { a: 1 } }, вы можете удалить foreach или использовать привязку with.

Как только вы заставите это работать, вы должны попробовать применить привязки с моделями представления заполнителя, прежде чем вы начнете загружать ваши данные. Это гарантирует, что хороший интерфейс отображается во время загрузки.

...