Невозможно получить модель в коллекции Backbone по CID
У меня есть следующие настройки режима / коллекции / просмотра в магистрали.
var Card = {};
//card model
Card.Model = Backbone.Model.extend();
//collection
Card.Collection = Backbone.Collection.extend({
url: '/api/cards',
model: Card.Model
});
//column view
Card.MainView = Backbone.View.extend({
className: 'column',
append: function(model) {
var view = Card.View.extend({
model : model,
attributes: { cid : model.cid }
});
var v = new view();
this.$el.append(v.el);
},
initialize: function() {
var self = this;
_.bindAll(this, "sortable");
this.collection.fetch({
success: function() {
self.render();
}
});
},
render: function() {
var self = this;
for(var i = 0; i < this.columns.length; i++) {
var col = this.columns[i];
var column = Card.ColumnView.extend({
data: col,
cards: self.collection.where({ position : col.position })
});
var col = new column();
this.$el.append(col.el);
}
this.sortable();
},
sortable: function() {
var self = this;
$(this.el).find('.card-container').sortable({
connectWith: '.card-container',
receive: _.bind(function(event, ui) {
var cid = $(ui.item).attr('cid');
var card = self.collection.get(cid);
//console.log(self.collection.last());
console.log('cid', self.collection.get(cid));
console.log('index 1', self.collection.at(1));
console.log('last', self.collection.last());
console.log('collection', self.collection);
}, this)
});
}
});
Когда я пытаюсь получить модель из коллекции MainView в sortable
Функция не будет регистрировать модель по CID. Я получаю следующий вывод.
cid undefined CardMetaCollection.js:97
index 1 d {collection: d, attributes: Object, _escapedAttributes: Object, cid: "c2", changed: Object…} CardMetaCollection.js:98
last d {collection: d, attributes: Object, _escapedAttributes: Object, cid: "c249", changed: Object…} CardMetaCollection.js:99
collection d {length: 249, models: Array[249], _byId: Object, _byCid: Object, url: "/api/cards"…}
Я попытался войти в success
обратный вызов для метода fetch, но я все еще получаю неопределенное возвращаемое... У каждой модели есть свой собственный cid. Буду признателен за любую оказанную помощь.
3 ответа
.get()
метод принимает либо id
или же cid
, id
может быть передан непосредственно в get
, но cid
должен быть передан как объектный литерал. На самом деле, вы можете передать id
в объектном литерале тоже и ваш код соответствует.
var cid = ...;
var card = self.collection.get({ cid: cid });
var id = ...;
var card = self.collection.get({ id: id });
var id = ...;
var card = self.collection.get(id);
Вы можете взглянуть на .get()
реализация в backbone.js.
ОБНОВЛЕНИЕ: cid
один может быть передан .get()
метод в Backbone 0.9.9 или новее (см. реализацию в текущей версии 1.3.3).
var cid = ...;
var card = self.collection.get(cid);
В вашем случае проблема, скорее всего, в атрибуте "cid", отсутствующем в элементах карты, как пишет Ben. Вы объявили .append()
метод, добавляющий этот атрибут к новым элементам, но вы вызываете new column()
вместо этого в .render()
метод. Кажется, что column
представление не добавляет атрибут, потому что ваша регистрация находит его undefined
,
Примечание: рассмотрите возможность использования допустимого имени пользовательского атрибута HTML, такого как "data-cid", а не просто "cid", например.
Использование cid, когда вы выдвигаете разностную модель в одну коллекцию, а остальные не отвечают уникальным идентификатором для всех отдельных запросов или, возможно, REST не возвращает идентификатор attr или мы хотим создать поддельную модель без отдыха и отправить ее в коллекцию
var banned = app.request('rest:banList');
var whiteIp = app.request("rest:inviteList");
var whiteGroup = app.request("rest:groupList");
$.when(banned, whiteIp, whiteGroup).done(function (bannedList, whiteIpList, whiteGroupList) {
debugger
var arr = new Backbone.Collection();
arr.add(bannedList);
arr.add(whiteIpList);
arr.add(whiteGroupList);
});
define(["app"], function (app) {
var API = {
getWho: function (data) {
var whois = new Backbone.Model();
whois.url = '/admin/whois';
whois.cid = 'ban';
var defer = $.Deferred();
whois.fetch({
type: 'GET',
data: data,
success: function(data){
debugger
defer.resolve(data);
},
error: function(data){
defer.reject(data);
}
});
return defer.promise();
}
};
app.reqres.setHandler("rest:getWho", function (data) {
return API.getWho(data);
});
});
- обеспечивать
cid
что вы переходите вself.collection.get(cid)
является идентификатором для любой из моделей, потому чтоcollection.get
ожидает идентификатор модели в качестве аргумента. Вы можете войти вcid
значение тоже для этого.