Eu não sigo. como o modelo é definido como uma função?
Na verdade, encontrei esse problema (ou algo semelhante) ontem.
Você pode definir uma função de modelo em uma coleção para criação de modelo polimórfico.
Ao chamar .add
em sua coleção, o código Backbone tenta chamar .prototype.idAttribute
no atributo model
, mas se você definiu a função model
como um método de classe ES2015, então ele não tem um atributo prototype
.
Então, por exemplo, isso causará o problema:
const Library = Backbone.Collection.extend({
model () {
// stuff goes here
}
});
Se você especificar assim, o problema desaparece:
const Library = Backbone.Collection.extend({
model: function () {
// stuff goes here
}
});
Na verdade, encontrei esse problema (ou algo semelhante) ontem.
Você pode definir uma função de modelo em uma coleção para criação de modelo polimórfico.
Ao chamar
.add
em sua coleção, o código Backbone tenta chamar.prototype.idAttribute
no atributomodel
, mas se você definiu a funçãomodel
como um método de classe ES2015, então ele não tem um atributoprototype
.Veja aqui:
Então, por exemplo, isso causará o problema:
const Library = Backbone.Collection.extend({ model () { // stuff goes here } });
Se você especificar assim, o problema desaparece:
const Library = Backbone.Collection.extend({ model: function () { // stuff goes here } });
Obrigado pela descrição detalhada do problema!
Mas sua resposta não é resolver o problema de idAttribute.
Ao adicionar nova referência de modelo não adicionada. Portanto, você não pode obter um novo modelo por id.
Workarond - adicionado model.prototype.idAttribute o mesmo que no modelo.
Eu acho que o problema é que model
em um Collection
é definido como: Override this property to specify the model class that the collection contains.
Esta API não suporta o modelo sendo definido como uma função.
@paulfalgout os documentos do backbone para Collection.model especificam que você pode definir uma função como model
. Que isso não seja possível com a sintaxe model ()
(em vez de model: function()
) parece um bug para mim ou pelo menos extremamente confuso.
Sim, vinculei à parte relevante dos documentos na minha mensagem original.
Veja aqui: https://backbonejs.org/#Collection -model
@PavelKoroteev : Parece que nossos problemas estão relacionados, mas não são os mesmos.
Aqui está o que estou falando (colado do console):
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
Acho que a questão é realmente a mesma. E também o mesmo que https://github.com/jashkenas/backbone/issues/4203
usar model: function(attrs, options)
criaria um protótipo que não teria idAttribute
e voltaria para id
para que "funcionasse"
Você está correto, o modelo polimórfico está documentado. _but_... ele não suporta métodos do tipo idAttribute
ou es6 por causa desta linha com model.prototype
por um bom tempo.
Parece que https://github.com/jashkenas/backbone/pull/3966 é uma espécie de correção :-/
Ver um PR de 2016 definhando e não sendo mesclado (ou rejeitado em favor de algo melhor) basicamente me desencoraja a tentar fazer um PR para corrigir esse problema.
Pelo que posso dizer, o Backbone está praticamente morto.
Como outros fizeram também, eu criei um fork, o meu é chamado Skeletor , que usarei para atualizar meu código do Backbone para APIs e padrões mais modernos e depois gradualmente mudarei para algo melhor.
Acabei de mesclar o antigo https://github.com/jashkenas/backbone/pull/3966 PR, depois de resolver conflitos. Deixe-me saber se lhe der algum problema...
Comentários muito úteis
Acabei de mesclar o antigo https://github.com/jashkenas/backbone/pull/3966 PR, depois de resolver conflitos. Deixe-me saber se lhe der algum problema...