我遇到了一个问题,这可能与我缺乏对循环依赖项使用exports / RequireJS的理解有关。
我得到了错误relatedModel does not inherit from Backbone.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 FooModelBarModel:
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我也尝试过:
Backbone.Model而不是Backbone.RelationalModel扩展Backbone.Model并自己创建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 FooModelBarModel:
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发布于 2013-03-16 03:11:48
你的BarModel需要'collections/foos',对吗?我猜想(因为没有FooCollection的代码)集合需要'models/foo',因为集合需要定义它的模型,对吗?最后,我可以从上面的代码中看出foo模型需要“model /bar”。
换句话说,foos需要foo,bar需要foos,foo,foo,bar需要.
不管怎么要求下订单,这三个中的一个必须先加载到其他三个,这会给你带来问题,就像你正在经历的那样。
解决方案是在加载所有三个模块之前不要加载这三个模块中的一个。例如,如果您更改:
define (require, exports) ->
Backbone = require 'backbone'
FooCollection = require 'collections/foos'
BarModel = Backbone.RelationalModel.extend
someFunction: ->
# uses FooCollection至:
define (require, exports) ->
Backbone = require 'backbone'
BarModel = Backbone.RelationalModel.extend
someFunction: ->
FooCollection = require 'collections/foos'
# uses FooCollection现在BarModel可以加载,虽然定义了someFunction,但它还没有实际运行,所以它不需要foos并创建循环依赖项。稍后,在加载了所有内容并调用了someFunction之后,foos已经有机会加载,并且需求应该可以工作。
现在我说应该有效,因为你的评论:
# I've tried moving the require in here and getting rid of exports再次,我不得不猜测,因为我看不到您的代码,但我可以想象,发生的事情是,没有其他依赖于foos,所以它从来没有被加载。为了满足foos在someFunction中同步工作的要求,必须先加载foos模块。
要解决这个问题,您只需要添加一个依赖于foos ..。只是这一次没有出现在任何需要foos的模块中(或者任何需要foos的模块,或者.)。
希望这能有所帮助。
https://stackoverflow.com/questions/15412706
复制相似问题