Backbone: idAttribute не определен для метода modelId, если модель определена как функция.

Созданный на 9 дек. 2019  ·  10Комментарии  ·  Источник: jashkenas/backbone

duplicate

Самый полезный комментарий

Я просто слил старый https://github.com/jashkenas/backbone/pull/3966 PR, после разрешения конфликтов. Дайте мне знать, если это доставит вам какие-либо затруднения...

Все 10 Комментарий

Я не понимаю. как модель определяется как функция?

Я действительно столкнулся с этой проблемой (или чем-то подобным) вчера.

Вы можете определить функцию модели в коллекции для создания полиморфной модели.

При вызове .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 .

Глянь сюда:

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
   }
});

Спасибо за подробное описание проблемы!

Но ваш ответ не решает проблему для idAttribute.

При добавлении новой ссылки на модель не добавляется. Поэтому вы не можете получить новую модель по id.

image

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, после разрешения конфликтов. Дайте мне знать, если это доставит вам какие-либо затруднения...

Была ли эта страница полезной?
0 / 5 - 0 рейтинги