Выполнение частичных обновлений с помощью подключаемого модуля сопоставления KnockoutJS

Прямо сейчас я использую этот JSON с плагином KO Mapping, и он работает нормально:

{
  "Controls": [
    {
      "Fields": [
        {
          "Name": "emailField", 
          "Text": "email", 
          "Visible": true
        }, 
        {
          "Name": "hiddenField", 
          "Text": "text", 
          "Visible": true
        }
      ], 
      "Name": "form2", 
      "Type": "Form"
    }, 
    {
      "Data": [
        [
          "Federico Aloi", 
          20
        ], 
        [
          "Andres Lopez", 
          31
        ], 
        [
          "Pablo Perez", 
          32
        ]
      ], 
      "Fields": [
        {
          "Name": "nameField", 
          "Text": "Nombre", 
          "Visible": true
        }, 
        {
          "Name": "ageField", 
          "Text": "Edad", 
          "Visible": true
        }
      ], 
      "Name": "datagrid1", 
      "Type": "Datagrid"
    }
  ], 
  "Name": "pagina1", 
  "Title": "Probando el KO"
}

Теперь мой требованием является выполнение «частичных обновлений». В некоторых сценариях, когда я хочу это сделать:

  • мне нужно изменить массив данных во втором элементе управления.
  • Мне нужно обновить только один элемент управления, а не всю страницу (это класс, который я сериализую, корень в этом JSON).
  • Мне нужно добавить еще один элемент управления на мою страницу.

Возможно, другим обходным решением было бы воссоздание исходного объекта с помощью ko.mapping.toJS(viewModel), изменение его и затем повторно-сопоставление... но я верю, что у вас получится нечто лучшее.


РЕДАКТИРОВАТЬ:Я пробовал с ko.mapping.fromJS(updatedControl, viewModel.Controls()[0]), но это не сработало, вот мой код:

function (control) {
    $.getJSON($.format('api/control/{0}/{1}', viewModel.Name(), control.Name()), function (response) {
        ko.mapping.fromJS(response, viewModel.Controls()[0]);
    });
},

ответ:

{
  "Fields": [
    {
      "Name": "emailField", 
      "Text": "email", 
      "Visible": true
    }, 
    {
      "Name": "hiddenField", 
      "Text": "text", 
      "Visible": true
    }
  ], 
  "Name": "form2", 
  "Type": "Form"
}

РЕДАКТИРОВАТЬ2:проверьте его по адресуhttp://jsfiddle.net/faloi/4FcAy/10/

6
задан faloi 19 April 2012 в 19:58
поделиться