Я не понимаю. как модель определяется как функция?
Я действительно столкнулся с этой проблемой (или чем-то подобным) вчера.
Вы можете определить функцию модели в коллекции для создания полиморфной модели.
При вызове .add
в вашей коллекции код Backbone пытается вызвать .prototype.idAttribute
$ для атрибута model
, но если вы определили функцию model
как ES2015, то у него нет атрибута prototype
.
См. здесь: https://github.com/jashkenas/backbone/blob/75e6d0ce6394bd2b809823c7f7dc014ddb6ae287/backbone.js#L1102 .
Так, например, это вызовет проблему:
const Library = Backbone.Collection.extend({
model () {
// stuff goes here
}
});
Если указать так, то проблема исчезнет:
const Library = Backbone.Collection.extend({
model: function () {
// stuff goes here
}
});
Я действительно столкнулся с этой проблемой (или чем-то подобным) вчера.
Вы можете определить функцию модели в коллекции для создания полиморфной модели.
При вызове
.add
в вашей коллекции код Backbone пытается вызвать.prototype.idAttribute
$ для атрибутаmodel
, но если вы определили функциюmodel
как ES2015, то у него нет атрибутаprototype
.Глянь сюда:
Так, например, это вызовет проблему:
const Library = Backbone.Collection.extend({ model () { // stuff goes here } });
Если указать так, то проблема исчезнет:
const Library = Backbone.Collection.extend({ model: function () { // stuff goes here } });
Спасибо за подробное описание проблемы!
Но ваш ответ не решает проблему для idAttribute.
При добавлении новой ссылки на модель не добавляется. Поэтому вы не можете получить новую модель по id.
Workarond — добавлен атрибут model.prototype.idAttribute такой же, как на модели.
Я думаю, проблема в том, что model
на Collection
определяется как: Override this property to specify the model class that the collection contains.
Этот API не поддерживает определение модели как функции.
@paulfalgout в основных документах для Collection.model указано, что вы можете установить функцию как model
. То, что это невозможно с синтаксисом model ()
(вместо model: function()
), кажется мне ошибкой или, по крайней мере, чрезвычайно запутанной.
Да, я дал ссылку на соответствующую часть документов в своем исходном сообщении.
См. здесь: https://backbonejs.org/#Collection -model
@PavelKoroteev : Похоже, наши проблемы связаны, но не одно и то же.
Вот о чем я (вставил из консоли):
collection = new (Backbone.Collection.extend({ model (attrs, options) { return new (Backbone.Model.extend({ idAttribute: 'customId' }))(attrs, options)}}));
child {length: 0, models: Array(0), _byId: {…}}
collection.add({ customId: 'id.1' });
backbone.js:1102 Uncaught TypeError: Cannot read property 'idAttribute' of undefined
at child.modelId (backbone.js:1102)
at child.get (backbone.js:997)
at child.set (backbone.js:872)
at child.add (backbone.js:814)
at <anonymous>:1:12
Я думаю, что проблема на самом деле та же. А также то же, что и https://github.com/jashkenas/backbone/issues/4203
использование model: function(attrs, options)
создаст прототип, в котором не будет idAttribute
, и он вернется к id
, чтобы он «работал»
Вы правы, полиморфная модель задокументирована. _но_... он уже давно не поддерживает методы типа idAttribute
или es6 из-за этой строки с model.prototype
.
Кажется, https://github.com/jashkenas/backbone/pull/3966 - это своего рода исправление: -/
Видя, что PR от 2016 томится и не объединяется (или отвергается в пользу чего-то лучшего), в основном отбивает у меня желание даже пытаться сделать PR, чтобы решить эту проблему.
Насколько я могу судить, Backbone практически мертв.
Как и другие, я создал форк, мой называется Skeletor , который я буду использовать для обновления кода Backbone до более современных API и стандартов, а затем постепенно перейду к чему-то лучшему.
Я просто слил старый https://github.com/jashkenas/backbone/pull/3966 PR, после разрешения конфликтов. Дайте мне знать, если это доставит вам какие-либо затруднения...
Самый полезный комментарий
Я просто слил старый https://github.com/jashkenas/backbone/pull/3966 PR, после разрешения конфликтов. Дайте мне знать, если это доставит вам какие-либо затруднения...