使用“需要使用Marionette”模块时,模块不可用

时间:2014-04-24 18:32:46

标签: javascript backbone.js requirejs marionette

我目前正在为学期论文开发一个网络应用程序。我之前只使用过Angular,但我认为Backbone绝对值得一试。但是,我确实难以获得运行Require.js的基本骨架。当我尝试访问之前需要的Marionette模块时,我的代码失败了。以下是代码的相关部分:

main.coffee

require.config
   # ...

require ["app"], (mod86) ->
    mod86.start()

app.coffee

define ["backbone", "marionette", "marionette.handlebars"], (Backbone, Marionette) ->
    mod86 = new Backbone.Marionette.Application()
    mod86.addRegions
        mainRegion: "#main"
    mod86.on "initialize:after", ->
        require ["index/index"], ->
            mod86.mainRegion.show(mod86.Index.Index)
            # This is where my code fails, because mod86.Index === undefined
    return mod86

索引/ index.coffee

require ["app", "hbs!/templates/index/index"], (mod86, indexTpl) ->
    mod86.module "Index", (Index, mod86, Backbone, Marionette, $, _) ->
        Index.Index = Marionette.ItemView.extend
            template:
                type: "handlebars"
                template: indexTpl
            serializeData: -> {}

我目前正在阅读David Sulc关于这个主题的书,我认为我非常密切地关注,我真的不喜欢任何奇特的东西。对我来说,在初始化完成后只注册模板似乎很奇怪,但这也是为了避免循环依赖。我也尝试了一些不同的配置,它们总是导致相同的错误。我可以完全放弃Marionette模块系统,只使用Require,但我觉得这不是可行的方法。
任何建议都会很高兴!

修改

添加一些console.log表明模块似乎只是在我尝试在我的函数中访问它之后才创建。在快速浏览一下Marionette来源之后,我不知道为什么会出现这种情况。

1 个答案:

答案 0 :(得分:1)

好吧,我明白了。在index/index.coffee我需要define代替require。看起来RequireJS没有看到require中的任何内容符合所需的依赖性,因此不执行回调。但是,在app.coffee中的回调完成后,会有一个新加载的文件,其中包含require语句,然后执行该语句。
因此,解决方案是在需要文件时始终使用define,即使您根本不返回任何内容。