Backbone.js relatedModel不从主干继承。RelationalModel--使用RequireJS和exports作为循环依赖项
我遇到了一个问题,可能与我对循环依赖项的Backbone.js relatedModel不从主干继承。RelationalModel--使用RequireJS和exports作为循环依赖项,backbone.js,requirejs,circular-dependency,backbone-relational,Backbone.js,Requirejs,Circular Dependency,Backbone Relational,我遇到了一个问题,可能与我对循环依赖项的导出的使用缺乏了解有关 我发现错误relatedModel未从主干继承。RelationalModel 关于代码(在CoffeeScript中;我希望没问题) 我有两个主干模型/RequireJS模块,FooModel和BarModel: FooModel: define (require) -> Backbone = require 'backbone' BarModel = require 'models/bar' FooModel
导出的使用缺乏了解有关
我发现错误relatedModel未从主干继承。RelationalModel
关于代码(在CoffeeScript中;我希望没问题)
我有两个主干模型/RequireJS模块,FooModel和BarModel:
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
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
我也尝试过:
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
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
从Backbone.Model
扩展FooModel
而不是Backbone.RelationalModel
,并自己创建thebar
集合(在parse
和自定义函数中)。(BarModel
具有另一个模型的HasOne
关系,因此我需要它仍然是RelationalModel
这可能是导出
工作方式的问题吗?据我所知,导出
只是提供了一个对象来挂起模块对象,以便在其他地方可以访问模块。发生错误的原因是BarModel
在FooModel
代码中的点实际上不是主干模型吗我定义关系
更新
我似乎已经解决了我的问题,尽管我不确定如何解决。我不能说我对不理解它为什么起作用感到高兴,但我确实对它起作用感到高兴。另请参见我对。的评论。在BarModel
代码下面的memoize
(在我使用下面的代码之前,我创建了一个变通方法,通过该方法,我在FooModel
的parse
函数中创建了关联的集合,并导出了BarModel
。但是,require'collections/foos'
的响应返回了这样一个对象:{FooCollection:}
,即它意外地被包装在另一个对象中。)
以下是更新的代码:
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
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
酒吧模式:
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
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
您的BarModel需要'collections/foos'
,对吗?我猜(因为FooCollection
没有代码)集合需要'models/foo'
,因为集合需要正确定义其模型?最后,我可以从上面的代码看出,您的foo模型需要“models/bar”
换句话说,foos需要foo需要bar需要foos需要foo需要bar需要
无论Require决定如何订购,这三种产品中的一种必须在其他产品之前加载,这会给您带来像您现在这样的问题
解决方案是在加载所有三个模块之前不加载这三个模块中的一个。例如,如果您更改:
define (require, exports) ->
Backbone = require 'backbone'
FooCollection = require 'collections/foos'
BarModel = Backbone.RelationalModel.extend
someFunction: ->
# uses FooCollection
致:
现在BarModel可以加载了,虽然定义了someFunction
,但它还没有实际运行,因此它不需要foos,也不需要创建循环依赖项。稍后,在加载所有内容并调用了someFunction
,foos就已经有机会加载了,require应该可以工作了
现在我说应该有效,因为你的评论:
# I've tried moving the require in here and getting rid of exports
再一次,我不得不猜测,因为我看不到你的代码,但我可以想象,发生的事情是没有其他东西依赖于foos,因此它从未被加载。为了让foos在someFunction
中同步工作,必须先加载foos模块
要解决这个问题,您只需要添加一个对foos的依赖项…只是这次不在任何需要foos的模块中(或任何需要需要foos的模块中,或…)
希望能有所帮助。是的,FooCollection需要models/foo
来定义它的模型。另外,我同意将require移到someFunction
应该可以,但正如我所说的,我已经尝试过了。我几天前就做到了。你可以查看我对上述问题的更新。我怀疑我的问题是怎么回事使用.memoize
。我不认为是.memoize
造成的;memoize
只是用一个函数来包装提供的函数,该函数可以缓存返回值,并且不会阻止require以任何方式返回模块。正如我在回答中所说的,进行require调用而不返回模块的方法是:a)具有循环依赖关系,或B)对尚未加载的模块使用无回调形式的require。您必须添加一个依赖项以使模块加载,或者删除(另一个不同的)循环依赖项-这是唯一可以修复以前任何错误的方法。