私はフォローしません。 モデルは関数としてどのように定義されますか?
私は昨日この問題(または同様の問題)に実際に遭遇しました。
ポリモーフィックモデルを作成するために、コレクションにモデル関数を定義できます。
コレクションで.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
属性はありません。ここを参照してください:
したがって、たとえば、これにより問題が発生します。
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: 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をマージしました。 何か問題があれば教えてください...
最も参考になるコメント
競合を解決した後、古いhttps://github.com/jashkenas/backbone/pull/3966PRをマージしました。 何か問題があれば教えてください...