BackboneJS,可从整个项目访问RequireJS App模块

时间:2013-11-30 16:36:14

标签: javascript ruby-on-rails backbone.js requirejs

在backbone-on-rails gem中,所有内容都被加载到一个“超类”

window.MyApp =
  Models: {}
  Collections: {}
  Views: {}
  Routers: {}   

  initialize: ->
    # start code here

然后所有类都由

创建
users = new MyApp.Collections.Users()

但重要的是我可以将变量设置为该顶级类的属性,然后从任何地方访问它。

MyApp.router = new MyApp.Routers.AppRouter()

# so later in a view I can call 
MyApp.router.navigate(...)

所以现在我正在创建一个简单的JS应用程序,我不需要Rails,而且我一直在使用RequireJS来处理RoR资产管道所做的所有事情。这开始有点困难,但我已经完成了所有这些。

我遇到的真正问题是我真的想要那个“顶级”课程,所以我可以在我的应用程序中创建一个模型(主要是每个视图)。但是我无法做到这一点。

require.config
  paths:
    jquery: '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min'
    underscore: 'vendor/underscore.min'
    backbone: 'vendor/backbone.min'
    templates: '../templates'

 require ['app'], (App) ->
   # I tried something like this, but window.MapApp still is inaccessible
   window.MapApp = App
   MapApp.initialize()

我真的希望能够设置App.user = new User(...)以及App.router = new Router(...)

感谢您坚持这一点。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以在单独的模块中创建命名空间,然后根据需要包含该模块:

应用程式:

define (require) ->
  app = {}
  app.Models = {}
  app.Collections = {}
  app.Views = {}
  app.Router = {}
  return app

主要:

require.config
  ...
require [
  'app'  
  'backbone'
  'router'    
], (MyApp, Backbone, AppRouter) ->
  MyApp.Router = new AppRouter
  Backbone.history.start();
  MyApp.Router.navigate ...

这是一个简单的演示:http://jsfiddle.net/Hc7ed/

我应该添加它(特别是如果你从头开始),在使用Require.js时不需要使用命名空间;这些模块不会污染全局命名空间。

答案 1 :(得分:1)

您可以做的一件事是修改教程here提出的结构,将应用程序对象传递给模块的initialize函数。例如,router.js文件可以具有此功能:

var initialize = function (app) {
    app.Routers = app.Routers || {};
    app.Routers.AppRouter = AppRouter;

    var app_router = new AppRouter;
    app.router = app_router;
    [...]
};

另外,你提到这不起作用:

window.MapApp = App

如果包含"app"模块的文件依赖于包含路由器和视图等的文件,则必然表示实现路由器的文件时视图加载及其工厂(传递给define调用的回调)已执行window.MapApp = App尚未执行 ,因为此语句无法执行,直到所有模块"app"取决于已加载并且已调用它们的工厂。