循環依存関係に対するexports
/ RequireJSの使用に関する理解不足に関係している可能性がある問題に遭遇しました。
エラーが発生していますrelatedModel does not inherit from Backbone.RelationalModel
。
コードに進みます (CoffeeScript で。問題ないことを願っています)...
FooModel と BarModel の 2 つの Backbone Models / RequireJS モジュールがあります。
FooModel:
define (require) ->
Backbone = require 'backbone'
BarModel = require 'models/bar'
FooModel = Backbone.RelationalModel.extend
relations: [
type: Backbone.HasMany
key: 'theBars'
relatedModel: BarModel # <-- this is where the BB Relational error is coming from
]
return FooModel
バーモデル:
define (require, exports) ->
Backbone = require 'backbone'
FooCollection = require 'collections/foos'
BarModel = Backbone.RelationalModel.extend
someFunction: ->
# uses FooCollection
# I've tried moving the require in here and getting rid of exports
exports.BarModel = BarModel
return BarModel # I've tried with and without this line, but CS just returns the last line anyway so removing it is functionally the same
私も試しました:
- 自分でコレクションを作成する代わりに拡張
FooModel
します(カスタム関数内およびカスタム関数内)。(は別のモデルの関係を持っているので、.Backbone.Model
Backbone.RelationalModel
theBars
parse
BarModel
HasOne
RelationalModel
これはおそらくexports
動作方法に問題がありますか?私が理解している限り、exports
モジュールオブジェクトをハングアップするためのオブジェクトを提供するだけで、モジュールが他の場所からアクセスできるようになります。コード内でリレーションを定義BarModel
した時点で実際にはバックボーン モデルではないため、エラーが発生していますか?FooModel
アップデート
方法はわかりませんが、問題を解決したようです。なぜそれが機能しているのか理解できないことに満足しているとは言えませんが、機能していることは確かにうれしいです. _.memoize
以下のBarModel
コードについての私のコメントも参照してください。
FooModel
(以下のコードを動作させる前に、の関数で関連するコレクションを作成し、parse
をエクスポートするという回避策を作成しましたBarModel
。ただし、 の応答はrequire 'collections/foos'
次のようなオブジェクトを返しました: {FooCollection: <Backbone.Collection Object>}
、つまり、予期せず別のオブジェクトにラップされました。)
更新されたコードは次のとおりです。
FooModel:
define (require) ->
Backbone = require 'backbone'
BarModel = require 'models/bar'
BarCollection = require 'collections/bars'
FooModel = Backbone.RelationalModel.extend
relations: [
type: Backbone.HasMany
key: 'theBars'
relatedModel: BarModel
collectionType: BarCollection
]
return FooModel
バーモデル:
define (require, exports) ->
Backbone = require 'backbone'
BarModel = Backbone.RelationalModel.extend
someFunction: -> #this actually used to use _.memoize (sorry for the incomplete code), so maybe it would have tried to run the function argument immediately?
# uses FooCollection
FooCollection = require 'collections/foos'
return AttributeModel