Магистраль - не анализировать каждую модель в коллекции после выборки

Как предотвратить функцию синтаксического анализа для модели при выборке коллекции?

    $(function() {
    var Task = Backbone.Model.extend({
        url : function() {
                return this.urlRoot + this.id;
        },
        urlRoot: 'index.php?c=light&a=list_tasks_bb&ajax=true&task=',
        parse: function (response, options) {
            console.log(options);
            console.log(response);
            return response;
        }
    });

    var TaskList = Backbone.Collection.extend({
        model: Task,
        url: 'index.php?c=light&a=list_tasks_bb&ajax=true',

        initialize: function () {

        },
        parse: function (response, options) {
            return response.tasks;
        }
    });

    var Light = Backbone.Router.extend({
        el: $('#light'),
        routes: {
            "tasks/:id": "taskAction",
            "*page": "defaultAction",
        },

        initialize: function () {
            _this = this;
            this.tasks = new TaskList();
            this.users = new UserList();
        },

        taskAction: function(id) {
            this.task = new Task({id: id});
            $.when (
                this.task.fetch()
            ).then(function(zzz) {
                new TaskView({model: _this.task}).render();
            });
        },
        defaultAction: function(page) {
            $.when (
                this.tasks.fetch(),
                this.users.fetch()
            ).then (function() {
                new TaskListView({collection: _this.tasks}).render();
            });
        }
    });
});

У меня есть одна модель и одна коллекция, которые я получаю через выборку ajax. У меня нет возможности сменить бэкенд, поэтому json-структура списка задач такая:

"contents": {},
"current": false,
"errorCode": 0,
"errorMessage": "",
"u": 4,
"tasks": [{
    "id": "12250",
    "t": "ZZZ",
    "cid": "24",
    "c": "2013-08-22 11:36:32",
    "dd": "02.09.2013",
    "sd": "02.09.2013",
    "pr": "300",
    "pid": "0",
    "atid": "1:4",
    "s": 0,
    "dl": ""
}, {
    "id": "12307",
    "t": "ZZZ",
    "cid": "42",
    "c": "2013-08-28 11:14:44",
    "dd": "05.09.2013",
    "sd": "28.08.2013",
    "pr": "200",
    "pid": "0",
    "atid": "1:4",
    "s": 0,
    "dl": ""
}, {
    "id": "12326",
    "t": "ZZZ",
    "cid": "2",
    "c": "2013-08-29 09:55:34",
    "dd": "31.08.2013",
    "sd": "29.08.2013",
    "pr": "200",
    "pid": "0",
    "atid": "1:4",
    "s": 0,
    "dl": ""
}],
"events": []

Именно по этой причине я использую синтаксический анализ для сбора. На этом шаге все в порядке. Структура JSON для одной задачи:

"contents": {},
"current": false,
"errorCode": 0,
"errorMessage": "",
"u": 4,
"tasks": [{
    "id": "12250",
    "t": "ZZZZ",
    "cid": "24",
    "c": "2013-08-22 11:36:32",
    "dd": "02.09.2013",
    "sd": "02.09.2013",
    "pr": "300",
    "pid": "0",
    "atid": "1:4",
    "text": "XXXXX",
    "s": 0,
    "dl": ""
}],
"comments": [{
    "id": "48178",
    "text": "CCCC",
    "cid": "4",
    "con": "23.08.2013"
}],
"events": []

Поэтому мне нужно снова проанализировать для получения одной задачи после «task.fetch ()». После того, как я добавил функцию синтаксического анализа в модель, она работала нормально, пока я не начал извлекать коллекцию, потому что после синтаксического анализа коллекции у меня уже есть правильные данные модели, но обратный вызов синтаксического анализа модели для каждой модели снова.

У меня есть правильный способ исправить это или лучше попытаться изменить бэкэнд?

PS Конечно, я могу сделать что-то вроде этого:

  if(response.tasks) {
    return response.tasks[0];
  } else {
    return response;
  }

Но я думаю, что это не правильное решение.


person Gabriel    schedule 06.09.2013    source источник


Ответы (1)


При создании моделей для вставки в коллекцию Backbone передает будущую коллекцию как вариант конструктору модели, который, в свою очередь, передает эту опцию parse. Вы можете проверить это свойство и прервать синтаксический анализ по мере необходимости:

var Task  = Backbone.Model.extend({
    parse : function(response, options){
        if (options.collection) return response;
        return response.tasks[0];
    }
});
var TaskList = Backbone.Collection.extend({
    model: Task,
    parse : function(response){
        return response.tasks;
    }
});

И демо http://jsfiddle.net/nikoshr/dfMgR/

person nikoshr    schedule 06.09.2013
comment
СПАСИБО! вы сэкономили мне МНОГО времени. - person Gaston Sanchez; 21.02.2014
comment
Мне потребовался день, чтобы обнаружить проблему с повторным анализом, настоящий спаситель. - person topless; 04.03.2014