我目前正在为学期论文开发一个网络应用程序。我之前只使用过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来源之后,我不知道为什么会出现这种情况。
答案 0 :(得分:1)
好吧,我明白了。在index/index.coffee
我需要define
代替require
。看起来RequireJS没有看到require
中的任何内容符合所需的依赖性,因此不执行回调。但是,在app.coffee
中的回调完成后,会有一个新加载的文件,其中包含require
语句,然后执行该语句。
因此,解决方案是在需要文件时始终使用define
,即使您根本不返回任何内容。