2015-07-10 2 views
1

У меня есть следующая функция, которая терпит неудачу при вызове:Магистральная модель - это функция?

getAll: function() { 
    return _todos.toJSON(); 
} 

_todos.toJSON is not a function он говорит мне.

Печать _todos дает мне функцию по какой-то причине function child().
Почему это так?

Вот мой Backbone.Model:

var _todos = Backbone.Model.extend(); 

getAll() функция сидит в моем Collection:

var TodoCollection = Backbone.Collection.extend({ 
    model: _todos, 
    getAll: ... 
}); 

Edit:

Я на самом деле подключения Backbone с React, так что может измените, как я это делаю.

В дополнение к getAll у меня есть это:

areAllComplete: function() { 
    return _.every(this.pluck('complete'), true); 
} 

example Я после кажется положить getAll и areAllComplete в Model и не использует Collection вообще. Я не мог этого понять, и, поскольку я хочу, чтобы это было спокойным по дороге, я добавил Collection и переместил getAll и другой внутри.

Возможно, это не то, что я хочу.

Edit 2:

Согласно предостережением, выход getAll как ожидается, будет Object не array. Вероятно, я должен добавить эту функцию к Model не Collection. Нужно думать об этом больше.

Я думаю, что это превратилось в еще один вопрос ...

ответ

2

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

Помимо этого для того, чтобы получить JSON всех моделей в вашей коллекции вы можете называть это toJSON метод

, например todoCollection.toJSON();

Или, если вы конкретно хотите в функции GETALL (может быть, вы хотите сделать что-то еще до возвращения данных), вы можете сделать следующее

var TodoCollection = Backbone.Collection.extend({ 
    model: Todo, 
    getAll: function() { 
     //do something 
     return this.toJSON(); 
    } 
}); 

//here we are passing in the data directly, but you might get it with a fetch call 
var todoStore = new TodoCollection(models); 
var todosJson = todoStore.getAll(); 

Другая вещь, чтобы отметить, является основой Нама ing convention - использовать PascalCase для классов и camelCase для экземпляров.

+0

Я вижу. Если вы хотите сохранить мой 'getAll()' в моей 'Collection', так как он еще не определен, как мне сделать вызов. 'this.' не работает из-за неопределенности. Или вы рекомендуете придерживаться этой функции снаружи? Я хочу иметь возможность называть 'TodoStore.getAll()' где 'TodoStore' является экземпляром' Collection'. – pushkin

+1

Вы можете по-прежнему включать функцию 'getAll()' в свою коллекцию, она будет определена на вашем прототипе TodoCollection. Чтобы использовать его, вы создадите экземпляр своей коллекции, например, «var TodoStore = new TodoCollection();», а затем «ToDoStore.getAll();' – Jack

+0

, где my 'getAll()' возвращает 'TodoCollection.toJSON()'? Я получаю 'TodoCollection.toJSON не функция' – pushkin

2

Это потому, что Backbone.Model.extend возвращает функцию-конструктор. Когда вы передаете его в коллекцию через свойство model, вы просто даете коллекции знать, какие модели она должна держать.

Чтобы получить JSON для всей коллекции, вызовите toJSON() в экземпляре коллекции.

var collection = new TodosCollection(); 
// add models 
collection.toJSON(); 

Если вы хотите JSON для одной конкретной модели, то получить ссылку на него с помощью сбора API (at, findWhere, get и т.д.) и вызывать toJSON() по этой ссылке.

var model = collection.at(0); 
model.toJSON(); 
Смежные вопросы