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。您必须添加一个依赖项以使模块加载,或者删除(另一个不同的)循环依赖项-这是唯一可以修复以前任何错误的方法。