JavaScript: Backbone.js заполняет коллекцию моделей - PullRequest
4 голосов
/ 10 февраля 2012

Вот что у меня есть:

var Item = Backbone.Model.extend({
    defaults: {
        id: 0,
        pid: 0,
        t: null,
        c: null
    },
    idAttribute: 'RootNode_', // what should this be ???
    url: 'page.php'
});

var ItemList = Backbone.Collection.extend({
    model: Item,
    url: 'page.php',
    parse: function(data) {
        alert(JSON.stringify(data)); // returns a list of json objects, but does nothing with them ???
    }
});

var ItemView = Backbone.View.extend({
    initialize: function() {
        this.list = new ItemList();
        this.list.bind('all', this.render, this);
        this.list.fetch();
    },
    render: function() {
        // access this.list ???
    }
});

var view = new ItemView();

Текущий (ожидаемый) отклик json:

{
    "RootElem_0":{"Id":1,"Pid":1,"T":"Test","C":"Blue"},
    "RootElem_1":{"Id":2,"Pid":1,"T":"Test","C":"Red"},
    "RootElem_2":{"Id":3,"Pid":1,"T":"Test2","C":"Money"}
}

Это успешно опрашивает page.php, и бэкэнд работает на $_SERVER['REQUEST_METHOD'] и возвращает необходимую информацию, однако я не знаю, почему коллекция не заполнена.

В parse функции ItemList он правильно показывает все выходные данные, но ничего с этим не делает.

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

Ответы [ 2 ]

8 голосов
/ 10 февраля 2012

Измените свой метод parse на:

parse: function(response){
   var parsed = [];
   for(var key in response){
      parsed.push(response[key]);
   }
   return parsed;
}

Чтобы следовать соглашениям, измените list внутри ItemView на model. Также в render():

render: function() {
    var template = _.template("<div>some template</div>");
    this.model.each(function(item){ 
        this.$el.append(template(item.toJSON()));
    }, this);
    return this;
}
1 голос
/ 10 февраля 2012

Метод синтаксического анализа, который вы должны возвращать данные после выполнения необходимого для этого анализа.

Обычный вариант использования для разбора будет, если вы отправляете обратно объект такой формы, как:

{ "id" : "NaN", "tasks": [ *all your models in a list here *] }

, тогда вы будете использовать разбор вот так:

parse: function (data) {
    return data.tasks
}

Затем Backbone обрабатывает все остальное.

Есть ли какая-то особая причина, по которой вы отправляете данные обратно в этот словарный формат?Не совсем ясно, как вы намереваетесь отобразить это на каждую модель коллекции.Ключ не имеет значения?если это так, вы должны возвращать список объектов в значениях (хотя см. примечание внизу).Если нет, и вы хотите присоединить его к моделям, его нужно переместить в объект, который вы используете в качестве значения, и отправить обратно список.

* Примечание. На самом деле не отправлять обратно JSONсписок голый.Существует эксплойт для запросов GET, который полагается на то, что списки сами по себе являются действительным javascript, когда вредоносный сайт может использовать объект Array и переопределить его, чтобы использовать тег сценария для вашего API, чтобы использовать учетные данные пользователей для получения любой доступной информации.в этом призыве.Вместо этого, когда вы хотите отправить обратно список, вы должны использовать что-то вроде этого:

{ result: [*list here*] }

Затем вы просто используете метод разбора, описанный выше, чтобы извлечь список.

...