CanJS parseModels и приведение данных

Я думаю, что у меня может быть странный вариант использования здесь. У меня есть модель Code с атрибутами code, title, description. Пользователи документируют работу (здравоохранение), они вводят code, скажем, 7, а 7 всегда означает, что что-то конкретное произошло, скажем, "Пациент вылечился". Что угодно, не важно. Дело в том, что я не хочу сохранять title и description в каждой модели, но я хочу иметь возможность извлекать их для отображения.

Таким образом, API предоставляет массив кодов, таких как [ 1, 13, "A4" ]. Я пытаюсь использовать как can.Model.parseModel, так и can.Map.define, чтобы преобразовать этот массив в Code моделей, но у меня возникла тяжелое время.

Почему в этом примере никогда не вызывается parseModel, parseModels? fiddle

Code = can.Model.extend({
  parseModel: function(data) {
    // return { code:data }
    console.log('Never hit!');
  },
  parseModels: function() {
    // ...
    console.log('Never hit!');
  }
},{
  _title: can.compute(function() {
    // return title from cached lookup
  })
});

Model = can.Model.extend({
  findAll: 'GET /Models'
},{
  define: {
    Codes: {
      Type: Code.List
    }
  }
});

can.fixture('GET /Models', function() {
  return [
    { Codes: [1,2,3] }, // I want to turn each number into an object
    { Codes: [4,5,6] },
    { Codes: [7,8,9] }
  ];
});

Model.findAll({});

person savinger    schedule 29.09.2014    source источник


Ответы (1)


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

Чтобы ваш пример работал, вы должны заставить Model.parseModel преобразовать каждый массив Code в массив объектов.

В качестве альтернативы вы можете изменить define.Codes.Type модели на что-то вроде:

Codes: {
  type: function(newVal){
    if(newVal instanceof Code.List) {
      return newVal
    } else {
      return new Code.List( newVal.map(function(num){ return {value: num}}) )
    }
  }
}
person Justin Meyer    schedule 29.09.2014
comment
Спасибо. Это было одно из моих предположений. Было бы неплохо, если бы фикстуры использовали parseModels, как и ожидалось. - person savinger; 30.09.2014
comment
Ответы Fixture проходят через parseModels. Но только parseModels модели, делающей запрос. parseModels предназначен только для управления данными Ajax. Все остальное должно быть сделано с помощью плагина define. - person Justin Meyer; 30.09.2014