Backbone: idAttribute é indefinido para o método modelId se o modelo for definido como função.

Criado em 9 dez. 2019  ·  10Comentários  ·  Fonte: jashkenas/backbone

duplicate

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...

Todos 10 comentários

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 .

Veja aqui: https://github.com/jashkenas/backbone/blob/75e6d0ce6394bd2b809823c7f7dc014ddb6ae287/backbone.js#L1102

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 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 .

Veja aqui:

https://github.com/jashkenas/backbone/blob/75e6d0ce6394bd2b809823c7f7dc014ddb6ae287/backbone.js#L1102

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.

image

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...

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

tribalvibes picture tribalvibes  ·  11Comentários

gfranko picture gfranko  ·  18Comentários

etler picture etler  ·  13Comentários

jonathan picture jonathan  ·  11Comentários

azizZaben picture azizZaben  ·  5Comentários