2016-02-22 3 views
1

У меня проблема: My API возвращает null - данных нет. (это хорошо!). Мой collection получает данные, но создает один пустой объект.Backbone Collection добавляет пустой объект, когда API возвращает данные

Мой результат API (с Firebug):

{"data":{"objects":null}} 

Моя коллекция:

var MyCollection = Backbone.Collection.extend({ 
    model: MyModel, 
    url: '/v1/ajax/load-objects', 

    parse: function(resp, xhr) { 
     return resp.data.objects; 
    } 
}); 

При печати self.model.toJSON() на мой взгляд (модель коллекции), я получаю это (от Firebug):

[Object {}] 

Мой вопрос: Почему коллекция помещает один пустой объект в мою коллекцию? API возвращает null, поэтому он должен быть пустым.

Я попытался добавить значения по умолчанию к моей модели (которые использует коллекция), они не отображаются. Поэтому я предполагаю, что он принимает значение null как данные для одного объекта. Как я могу заставить его сделать это?

Thx

Рон

+1

Вы пробовали возвращение пустой array ('[]'), когда 'objects' равно null? Материнская плата IIRC ожидает, что массив будет возвращен из 'parse'. Я предполагаю, что он видит, что вы возвращаете один объект (null) и предполагает, что вам нужен массив из одного элемента длиной. – ivarni

+0

хороший момент, я попробую – Ron

ответ

2

Если вы поищите исходный код Магистральная, вы увидите, что модели внутри коллекции обрабатываются Collection.set

После Collection.set синтаксический анализ данных, он выполняет проверку на то, что вы на самом деле вернулся и создает массив, если значение (null в вашем случае) не является массивом:

var singular = !_.isArray(models); 
models = singular ? [models] : models.slice(); 

Этот список моделей затем обрабатывается и создает единую модель в вашей коллекции.

Решение простое: возвращает пустой массив, когда вы нажмете значение null в parse:

var MyCollection = Backbone.Collection.extend({ 
    model: MyModel, 
    url: '/v1/ajax/load-objects', 

    parse: function(resp, xhr) { 
     return resp.data.objects || []; 
    } 
}); 

И демо, имитируя вашу проблему http://jsfiddle.net/nikoshr/s2dve9ob/ и ее решение: http://jsfiddle.net/nikoshr/s2dve9ob/1/

0

Хорошо, теперь, кажется, работает. Но я действительно не понимаю почему :)

Я добавил (пусто) defaults к моей модели. Теперь это работает.

var MyModel = Backbone.Model.extend({ 
    defaults: { 
    }, 

    initialize: function() { 
     var self = this; 
    } 
});