2012-03-13 1 views
2

У меня проблема с Knockout.js и его плагином для сопоставления. По сути, я хочу начать с отсутствия данных, а затем на загрузке страницы сделать запрос Ajax для загрузки информации. Я знаю, что запрос Ajax работает как предполагаемая причина. Я регистрирую на консоли данные по мере их возвращения.Наблюдаемый массив Knockout.js не обновляется с сервера при использовании плагина сопоставления

var projectId = @Model.Project.Id; 
    var stories; 
    viewModel = ko.mapping.fromJS(stories);  

    $.ajax({ 
     type: "GET", 
     url: "/Projects/JsonDetails", 
     data: {id: projectId}, 
     success: function (data) { 
      stories = data.stories; 
      ko.mapping.fromJS(stories, viewModel); 
      console.log(stories); 
     } 
    }); 

Консоль правильно регистрирует данные. поэтому я знаю, что запрос Ajax работает правильно.

The console is logging the the data correctly. so I know that the Ajax request is working properly. л

разметки:

<section id="project-stories" data-bind="foreach: stories"> 

      <div class="project-story-container drop-shadow"> 

       <div class="story-summary"> 
        Story Summary 
       </div> 
       <div class="story" data-bind="attr:{'data-id': Id}"> 
        As a <span class="actor" data-bind="text: Actor"> </span> I want to <span class="objective" data-bind="text: Objective"> </span>, so that <span class="justification" data-bind="text: Justification"></span>. 
       </div> 
       <div class="story-controls"> 
        <a href="#">Edit</a> 
       </div> 
      </div> 
     </section> 

Я даже попытался назвать:

var projectId = @Model.Project.Id; 
    var stories; 
    viewModel = ko.mapping.fromJS(stories); 
    ko.applyBindings(viewModel); 

    $.ajax({ 
     type: "GET", 
     url: "/Projects/JsonDetails", 
     data: {id: projectId}, 
     success: function (data) { 
      stories = data.stories; 
      ko.mapping.fromJS(stories, viewModel); 
      console.log(stories); 
     } 
    }); 

Но это только делает его хуже причина KO жалуется, что привязки не являются настроить. enter image description here

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

Уходя учебник здесь: http://knockoutjs.com/documentation/plugins-mapping.html

-------------------- UPDATE ------------- -------------

Я был в состоянии ответить на мой собственный вопрос, ссылаясь этот StackExhange сообщение:

Knockout JS mapping plugin confusion

var projectId = @Model.Project.Id; 
    var viewModel ={}; 
    $.ajax({ 
     type: "GET", 
     url: "/Projects/JsonDetails", 
     data: {id: projectId}, 
     success: function (data) { 
      viewModel.stories = ko.mapping.fromJS(data.stories); 
      ko.applyBindings(viewModel); 
     } 
    }); 

Проблема была мне нужна, чтобы иметь пустая модель для этого работать.

ответ

0

Проблема в том, как вы выполняете сопоставление. Вам не следует отображать data.stories, но data сам ko.mapping.fromJS(data, viewModel); Таким образом, плагин отображения создаст наблюдаемый массив для рассказов, которые затем можно использовать в вашем шаблоне.

Если data содержит другие элементы, которые вы не хотите отображать, вы можете добавить их в массив игнорирования, чтобы отображались только истории.

Еще одна вещь - если вы начинаете без данных, вы получите эту ошибку при загрузке страницы, потому что Knockout попытается отобразить stories в вашей модели просмотра, если такого свойства не существует. Определите свой viewmodel раньше времени, чтобы содержать stories в качестве наблюдаемого массива.

+0

Возможно, я смущен.Я думал, что использование плагина сопоставления было таким, что мне не пришлось бы определять все мои наблюдаемые. Мое понимание заключалось в том, что вызов «ko.mapping.fromJS (данные)»; создадут их для меня. Что делать, если у меня есть большой объект со связью больше наблюдаемых? – sheldonj

+0

Правильно - это создаст наблюдаемые объекты. Однако, если вы попытаетесь использовать свою модель просмотра до того, как будут определены все наблюдаемые (например, загрузка страницы), вы получите сообщение об ошибке (например, ваши истории не будут определены). –

+0

Я не заметил, что вы не применяете привязку при загрузке страницы, поэтому, очевидно, вы не получите ошибку в этом случае. –

0

@Marek Karbarz Hi, Я не верю, что вы должны пройти весь viewModel. Например, если у вас есть модель для страницы, модель имеет объект SearchCriteria и объект Results. Зачем вам нужно передать объект Results обратно, когда вам нужно только выполнить поиск?

-Edward