2013-07-17 3 views
1

Я не уверен, как проинструктировать плагин, чтобы не было видно специфическое свойство внутреннего массива.Параметры плагинов для нокаутов

Возьмите этот JSON, как мои данные:

{ 
    Id: 1, 
    Description: "test", 
    Roles: [{ Id: 1, Name: "Role 1" }, { Id: 2, Name: "Role 2" }] 
} 

Массив Роли должны быть видны, но я не хочу, чтобы сделать наблюдаемыми «ID» поля для любого из элементов, я пытаюсь Differents подходит, но не повезло:

ko.mapping.fromJS(data, { 'copy': [ "Roles.Id" ] }); 
ko.mapping.fromJS(data, { 'copy': [ "Roles[].Id" ] }); 
ko.mapping.fromJS(data, { 'copy': [ "Roles[0].Id" ] }); // this only works with the first item 

Любые идеи?

ответ

1

Я не знаю, есть ли прямое решение для вашей проблемы, я попытался перейти к потомкам массива Roles, но никто не работает (как и ваши попытки), но вы можете сделать простой трюк, указав свою модель для Roles item объект:

function RolesModel(id, name) { 
    this.Id = id; 
    this.Name = ko.observable(name); 
} 

Затем использовать конфигурацию отображения для управления созданием вашего Roles объекта как это:

var mapping = { 
    'Roles': { 
     create: function (options) { 
      return new RolesModel(options.data.Id, options.data.Name) 
     } 
    } 
} 

, как я сказал вам, я не знаю, прямое решение, но это Ассоль Работа. Просьба проверить мои DEMO

1

Хорошо, возможно, я нашел решение, начиная с предложения @ebram tharwat.

Я расщепленные варианты отображения в двух:

var mappingRole = { 'copy': ["Id"] }; 

var mapping = { 
    'Roles': { 
     create: function (opts) { 
      return ko.mapping.fromJS(opts.data, mappingRole); 
     } 
    } 
}; 

, а затем мое первоначальное отображение может быть что-то вроде:

ko.mapping.fromJS(data, mapping); 

и, кажется, работает хорошо, не уверен, что о производительности, но для меня важнее не определять вручную режимы представления потомков.

Смежные вопросы