2014-09-29 2 views
2

Я думаю, что у меня может быть странный случай использования. У меня есть модель Code с атрибутами code, title, description. Пользователи документируют работу (здравоохранение), они вводят code, скажем 7, а 7 всегда означает, что что-то особенное произошло, скажем: «Пациент был излечен». Неважно, не имеет значения. Точка в том, что я не хочу беспокоить сохранение title и description в каждой модели, но я хочу, чтобы их можно было вытащить для отображения.CanJS parseModels и принуждение данных

Таким образом, 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({}); 

ответ

2

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

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

В качестве альтернативы, вы можете изменить 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}})) 
    } 
    } 
} 
+0

Спасибо. Это было одно из моих догадок. Было бы неплохо, если бы светильники использовали parseModels, как ожидалось. –

+1

Ответы на ярлык выполняются через parseModels. Но только parseModels модели делают запрос. parseModels предназначен только для манипулирования данными Ajax. Что-то еще нужно сделать с помощью плагина define. –

+0

О, это очищает его. –

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