1

Я столкнулся с странной проблемой с отображением Ko. я использую этот кусок кода:Данные отображения нокаута от ajax post vs Статические данные

var PList = [{ "Region": { "RegionName": "SomeRegion" }, "CDetails": {}, "Category": { "Name": "SomeCategory" }, "PSource": 1, "PDate": "0001-01-01T00:00:00"}]; 

var PViewModel = ko.mapping.fromJS(search('someSearch', 'True')); 
var PViewModel2 = ko.mapping.fromJS(PostList); 

function search(queryString, isFirst) { 
    $.ajax({ 
     type: 'POST', 
     url: 'url', 
     data: { 'searchQuery': queryString }, 
     dataType: 'json', 
     success: function (dt) { 
      if (isFirst != 'True') { 
       ko.mapping.fromJS(dt, PostsViewModel); 
      } 
      return dt; 
     } 
    }); 
}; 

Как ни странно, я вижу 2 результата:

  1. Когда я иду в PViewModel (тот, населенной AJAX) Я вижу это как undefined
  2. Когда я иду к PViewModel2 (тот, у которого есть статические данные) Я вижу объекты как ожидалось

* Статические данные PViewModel2 - это всего лишь копия данных, возвращаемых a jax post.

Мои вопросы:

  1. Кто-нибудь знает, почему это так? И как это исправить?
  2. Кроме того, является ли статья if (isFirst != 'True') правильным способом инициализации модели просмотра ko?
+0

Ваш вопрос непонятен – user2779544

+0

Включите все ваши скрипты, чтобы мы могли видеть структуры моделей и привязки – Stokedout

ответ

1

Вы имеете дело с асинхронной операцией (запрос Ajax). Эти операции не имеют возвращаемых значений. Таким образом, это никогда не может работать:

ko.mapping.fromJS(search('someSearch', 'True')); 

Вот что success обратного вызова для. Входящие данные могут обрабатываться только там.

function search(queryString, targetObservable) { 
    $.ajax({ 
     type: 'POST', 
     url: 'url', 
     data: { 'searchQuery': queryString }, 
     dataType: 'json', 
     success: function (dt) { 
      ko.mapping.fromJS(dt, targetObservable); 
     } 
    }); 
}; 

search('someSearch', PostsViewModel);