首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >relatedModel不从Backbone.RelationalModel继承--使用RequireJS和导出循环依赖项。

relatedModel不从Backbone.RelationalModel继承--使用RequireJS和导出循环依赖项。
EN

Stack Overflow用户
提问于 2013-03-14 14:58:20
回答 1查看 851关注 0票数 2

我遇到了一个问题,这可能与我缺乏对循环依赖项使用exports / RequireJS的理解有关。

我得到了错误relatedModel does not inherit from Backbone.RelationalModel

关于代码(在CoffeeScript中,我希望这样可以).

我有两个主干模型/ RequireJS模块,FooModel和BarModel:

FooModel:

代码语言:javascript
复制
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

BarModel:

代码语言:javascript
复制
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

我也尝试过:

  1. Backbone.Model而不是Backbone.RelationalModel扩展Backbone.Model并自己创建theBars集合(在parse和自定义函数中)。(BarModel有另一个模型的HasOne关系,所以我需要它仍然是一个RelationalModel

这可能是exports工作方式的问题吗?据我所知,exports只是提供了一个对象来挂起模块对象,以便模块可以在其他地方访问。发生错误是因为在我定义关系的BarModel代码中,FooModel实际上不是骨干模型吗?

更新

我似乎已经解决了我的问题,尽管我不知道如何解决。我不能说我很高兴不理解它为什么会起作用,但我很高兴它能起作用。还可以在下面的_.memoize代码中看到我对BarModel的评论。

(在我开始使用下面的代码之前,我创建了一个解决方案,通过它我在FooModelparse函数中创建了关联的集合并导出了BarModel。然而,require 'collections/foos'的响应返回了这样一个对象:{FooCollection: <Backbone.Collection Object>},即它意外地被包装在另一个对象中。)

以下是更新的代码:

FooModel:

代码语言:javascript
复制
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

BarModel:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2013-03-16 03:11:48

你的BarModel需要'collections/foos',对吗?我猜想(因为没有FooCollection的代码)集合需要'models/foo',因为集合需要定义它的模型,对吗?最后,我可以从上面的代码中看出foo模型需要“model /bar”。

换句话说,foos需要foo,bar需要foos,foo,foo,bar需要.

不管怎么要求下订单,这三个中的一个必须先加载到其他三个,这会给你带来问题,就像你正在经历的那样。

解决方案是在加载所有三个模块之前不要加载这三个模块中的一个。例如,如果您更改:

代码语言:javascript
复制
define (require, exports) ->
    Backbone = require 'backbone'
    FooCollection = require 'collections/foos'
    BarModel = Backbone.RelationalModel.extend
        someFunction: ->
            # uses FooCollection

至:

代码语言:javascript
复制
define (require, exports) ->
    Backbone = require 'backbone'
    BarModel = Backbone.RelationalModel.extend
        someFunction: ->
            FooCollection = require 'collections/foos'
            # uses FooCollection

现在BarModel可以加载,虽然定义了someFunction,但它还没有实际运行,所以它不需要foos并创建循环依赖项。稍后,在加载了所有内容并调用了someFunction之后,foos已经有机会加载,并且需求应该可以工作。

现在我说应该有效,因为你的评论:

代码语言:javascript
复制
# I've tried moving the require in here and getting rid of exports

再次,我不得不猜测,因为我看不到您的代码,但我可以想象,发生的事情是,没有其他依赖于foos,所以它从来没有被加载。为了满足foos在someFunction中同步工作的要求,必须先加载foos模块。

要解决这个问题,您只需要添加一个依赖于foos ..。只是这一次没有出现在任何需要foos的模块中(或者任何需要foos的模块,或者.)。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15412706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档