Backbone: モデルが関数として定義されている場合、idAttributeはmodelIdメソッドに対して未定義です。

作成日 2019年12月09日  ·  10コメント  ·  ソース: jashkenas/backbone

duplicate

最も参考になるコメント

競合を解決した後、古いhttps://github.com/jashkenas/backbone/pull/3966PRをマージしました。 何か問題があれば教えてください...

全てのコメント10件

私はフォローしません。 モデルは関数としてどのように定義されますか?

私は昨日この問題(または同様の問題)に実際に遭遇しました。

ポリモーフィックモデルを作成するために、コレクションにモデル関数を定義できます。

コレクションで.addを呼び出すと、バックボーンコードはmodel属性で.prototype.idAttributeを呼び出そうとしますが、 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を呼び出すと、バックボーンコードはmodel属性で.prototype.idAttributeを呼び出そうとしますが、 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: function()の代わりに) model ()構文では不可能であるということは、私にはバグのように思えるか、少なくとも非常に混乱しているようです。

はい、元のメッセージのドキュメントの関連部分にリンクしました。

ここを参照してください: 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にフォールバックされるため、「機能」します。

あなたは正しいです。ポリモーフィックモデルは文書化されています。 _but _... model.prototypeのこの行がかなり長い間あるため、 idAttributeまたはes6タイプのメソッドをサポートしていません。

https://github.com/jashkenas/backbone/pull/3966はある種の修正のようです:-/

2016年のPRが低迷し、マージされない(またはより良いものを優先して拒否される)のを見ると、基本的に、この問題を修正するためにPRを作成しようとすることさえ思いとどまります。

私の知る限り、バックボーンはほとんど死んでいます。

他の人もそうしているように、私はフォークを作成しました。私のものはSkeletorと呼ばれ、Backboneコードをより新しいAPIと標準に更新するために使用します。その後、徐々により良いものに移行します。

競合を解決した後、古いhttps://github.com/jashkenas/backbone/pull/3966PRをマージしました。 何か問題があれば教えてください...

このページは役に立ちましたか?
0 / 5 - 0 評価