2013-10-04 2 views
1

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

ответ Сервер всегда находится в структуре { ERRCODE: ххх, данные: {объект массива} }

И я определил разбор как в модели и коллекции:

parse:funciton(response){ 
    if(100==response.errcode){ 
     return response.data; 
} 

поэтому, когда я сохраняю/извлекаю из модели, он работает правильно.

Однако, когда я берусь из коллекции, все будет не так, как я ожидал. Ответ сначала будет разобран в коллекции, а затем снова проанализирован в модели. Я надеюсь, что коллекция может передать объект новой модели, не будучи снова проанализированной на уровне модели.

Я попробовал fetch {parse: false}. Однако это приведет к отключению синтаксического анализа как на уровне коллекции, так и на уровне модели.

Могу ли я просто отключить синтаксический анализ на уровне модели при вызове fetch на уровне сбора? Благодаря!

+0

почему вы разбираете их обоих? – shem86

ответ

1

Вы могли бы просто передать другой вариант вашей коллекции выборки метод следующим образом:

collection.fetch({parseModel: false});

, а затем проверить в parse методе вашей модели, если это опция существует:

parse: function(resp, options) { 
    if(!options.parseModel) return resp; 
    // Do your parsing here 
} 

Еще лучше, если вы можете включить опцию по умолчанию в fetch методе Вашей коллекции:

fetch: function(options) { 
    options = _.extend({parseModel: false}, options); 
    return Backbone.Collection.prototype.fetch.call(this, options); 
} 

Конечно, вы должны были бы установить по умолчанию, чтобы для fetch метода вашей модели тоже:

fetch: function(options) { 
    options = _.extend({parseModel: true}, options); 
    return Backbone.Model.prototype.fetch.call(this, options); 
} 
+0

Большое вам спасибо! Кстати, я не понял, почему мне нужно установить метод выборки по умолчанию для моей модели? Я думаю, что если я буду распространять только метод извлечения коллекции, это не будет иметь эффекта, когда я получаю мою модель напрямую ... Спасибо! – yeelan

+0

Причина в том, что если вы выберете модель самостоятельно с передачей любых параметров ('model.fetch()'), она не будет проходить через метод 'parse', потому что параметр' parseModel' не установлен нигде. Если вы всегда хотите проанализировать модель, когда вы делаете 'model.fetch()', тогда вам нужно установить ее как значение по умолчанию где-то. :) – gbsice

0

Попробуйте для разбора коллекции:

parse: function (response) { 
    return response.data.map(function (data) { 
     return { 
      errcode: response.errcode, 
      data: data 
     }; 
    }); 
} 
Смежные вопросы