Подтвердить что ты не робот

Переопределение функции синтаксического анализа

Я пытаюсь использовать Backbone с API.

Формат ответа по умолчанию API:

{
somemetadatas:xxx , 
results:yyy
}

Будет ли это выборка для одной модели или коллекции.

Итак, насколько я знаю, я могу переопределить функцию Backbone parse с помощью:

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

Но я видел в документацию:

parse collection.parse(response)

parse вызывается Backbone каждый раз модели коллекции возвращаются сервером при извлечении. функции передается исходный объект response, и он должен вернуть массив атрибутов модели, который будет добавлен в коллекцию. По умолчанию реализация - это не-op, просто проходя через ответ JSON. Переопределите это, если вам нужно работать с существующим API или лучше namespace ваши ответы. Обратите внимание, что после этого, если ваш модельный класс уже имеет функцию parse, она будет работать против каждого выбранного модель.

Итак, если у меня есть ответ на выборку коллекции следующим образом:

{
somemetadatas:xxx , 
results:[user1,user2]
}

Первая функция parse в коллекции будет извлекать [user1,user2].

Но в документе говорится:

Обратите внимание, что после этого, если ваш класс модели уже имеет функцию parse, она будет работать против каждого выбранного модель.

Поэтому он попытается найти response.results; на user1 и user2

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

Но если я получаю в коллекции, я не хочу, чтобы функция синтаксического анализа модели использовалась снова в одном элементе массива.


Итак, есть ли решение этой проблемы?

Я думаю о решении, в котором моя функция анализа сеанса преобразует что-то вроде этого:

{
somemetadatas:xxx , 
results:[user1,user2]
}

в нечто подобное:

[ {results.user1} , {results.user2} ]

Таким образом, функция синтаксического анализа модели не выйдет из строя при извлечении коллекции. Но это немного хаки... есть ли элегантное решение этой проблемы?


Кстати, поскольку мой API всегда будет выводить результаты этой формы, можно ли по умолчанию по умолчанию отключить функцию parse для всех моих моделей и коллекций? (Извините, что я JS noob...)

4b9b3361

Ответ 1

Вы можете проверить, будут ли полученные вами данные обернуты членом results и соответственно отреагируют. Например,

var M = Backbone.Model.extend({
    parse: function (data) {
        if (_.isObject(data.results)) {
            return data.results;
        } else {
            return data;
        }
    }
});

И скрипт http://jsfiddle.net/9rCH3/

Если вы хотите обобщить это поведение, выведите все классы модели из этого базового класса или прототип прототипа Backbone, чтобы обеспечить эту функцию:

Backbone.Model.prototype.parse = function (data) {
    if (_.isObject(data.results)) {
        return data.results;
    } else {
        return data;
    }
};

http://jsfiddle.net/9rCH3/1/

Ответ 2

Анализ также должен быть реализован в коллекции.

var EgCollection = Backbone.Collection.extend({
    parse: function (data) {
       if (_.isObject(data.results)) {
          return data.results;
       } else {
          return data;
       }
    }
});

http://backbonejs.org/#Collection-parse