Knockout JS Mapping из JSON не работает

Я получаю строку JSON и пытаюсь сопоставить ее с виртуальной машиной KOJS, но не понимаю, почему приведенный ниже код не работает.

Вот мой JS-файл:

var viewModel = {};

$.ajax({
  url: '../data/settings',
  cache: false,
  success: function(data) {
    alert(data);
    viewModel = ko.mapping.fromJS(data);
    ko.applyBindings(viewModel);
  }
});

Первое оповещение отображает:

{"remember":"false"}

Мой HTML, который не работает:

<span data-bind="value:remember"></span>

Вы знаете, что здесь может быть не так? Спасибо!


person jamesplease    schedule 18.12.2012    source источник
comment
AFAIK модель представления KnockoutJS является литералом объекта и поэтому не имеет свойства length.   -  person Kevin Boucher    schedule 18.12.2012
comment
Ох, ладно. Это знание может сделать процесс отладки более плавным :) Спасибо, @Kevin!   -  person jamesplease    schedule 18.12.2012


Ответы (2)


Я думаю, что проблема может быть в вашем коде привязки:

<span data-bind="value:remember"></span>

должно быть:

<span data-bind="text:remember"></span>

См. эту скрипту: http://jsfiddle.net/kboucher/Jj9DZ/

«значение» предназначено для полей формы, которые имеют свойство значения (и могут быть абстрагированы, чтобы включать поля select)

person Kevin Boucher    schedule 18.12.2012
comment
Хороший улов, @Kevin. На самом деле я только что уловил это и внес изменение; все еще нет кости, хотя. - person jamesplease; 18.12.2012
comment
Ну, это работает на скрипке. Но мне пришлось опустить ваш вызов объекта сопоставления, возможно, проблема в нем. - person Kevin Boucher; 18.12.2012
comment
Ах да, хорошая мысль @Kevin. Если я использую JSON.parse, он работает. Но, похоже, у него проблемы с отображением. Хм! - person jamesplease; 18.12.2012
comment
В конце концов, я почти уверен, что это была моя ошибка. Отображение работает, если я использую fromJSON и правильно настроил это. Спасибо @Кевин! - person jamesplease; 18.12.2012

Похоже, ваши данные могут быть не строкой JSON, поэтому вместо этого вы хотите использовать fromJS:

viewModel = ko.mapping.fromJS(data);

Этот вопрос может помочь при отладке привязок: Как отладить ошибки привязки шаблона для KnockoutJS?

person Geoff    schedule 18.12.2012
comment
Хорошее предложение. Я тоже пробовал это, но когда я это делаю, отображается длина 0. - person jamesplease; 18.12.2012
comment
ваш viewModel.length всегда будет равен 0, так как viewModel - это функция. этот вопрос может помочь при отладке привязок: stackoverflow.com/questions/9261296/ - person Geoff; 18.12.2012
comment
+1 за хорошую ссылку на ссылку. Вы должны указать это в своем ответе - person jamesplease; 18.12.2012