2012-07-09 18 views
8

Me han definido una configuración RequireJS que define caminos y cuñas:RequireJS: Use carga automática-deps con cuña

require.config({ 
    // define application bootstrap 
    deps: ["main"], 

    // define library shortcuts 
    paths: { 
     app: "app" 
     , jquery: "lib/jquery" 
     , underscore: "lib/underscore" 
     , backbone: "lib/backbone" 
     , bootstrap: "lib/bootstrap" 
    }, 

    // define library dependencies 
    shim: { 
     jquery: { 
      exports: "$" 
     }, 
     underscore: { 
      exports: "_" 
     }, 
     backbone: { 
      deps: ["underscore", "jquery"], 
      exports: "Backbone" 
     }, 
     bootstrap: { 
      deps: ['jquery'], 
      exports: "bootstrap" 
     }, 

     // main application 
     app: { 
      deps: ["backbone"], 
      exports: "App" 
     } 
    } 
}); 

Como se ve el último "cuña" declaración debe hacerla acceder a la columna vertebral (y deps) cuando cargo la aplicación principal (-paso de nombre).

En realidad esto no funciona:

require(["app"], function($, _, Backbone, App){ 
    app.router = new Backbone.Router.extend({ 
     // routing and route actions 
    }); 
}); 

Lo que me hace preguntarse es que en la "columna vertebral-boilderplate" -project, Backbone (y sus deps) están disponibles de esta manera: https://github.com/tbranyen/backbone-boilerplate/blob/master/app/main.js

El ni siquiera tuvo que definir esto en la función.

Entonces, ¿qué estoy haciendo mal?

+2

intente eliminar el '$, _, Backbone' de la función' require' donde extiende el enrutador. Creo que las cuñas funcionan para que solo exporten valores globales que no necesitas agregar a ninguna llamada – jakee

+0

Oye, eso funciona genial :) Incluso puedo soltar la palabra clave "backbone" en la matriz deps de la función define aunque esto no funciona en todos los módulos ... ¿Crearías una respuesta para poder cerrar la pregunta? –

+0

¡Listo, me alegro de poder ayudar! – jakee

Respuesta

5

Elimine los $, _, Backbone -parámetros de la require -función donde extiende el enrutador. Las cuñas exportan valores globales, por lo que no es necesario hacer referencia a ellas en require o define llamadas como lo hace para las dependencias normales.

Al pasarlos como parámetros se confunde con las variables globales y lo más probable es que no se definan.

+1

Una precisión: pasar Backbone como un parámetro oculta la definición global, podría usar 'window.Backbone' directamente – nikoshr

11

Por lo que he leído, RequireJS pasa argumentos en base a lo que se especifica en la matriz ... Por lo tanto la llamada debe tener este aspecto:

require(["app"], function (App) { // less arguments 
}); 

O así:

require(
    ["jquery", "underscore", "backbone", "app"], // more deps 
    function ($, _, Backbone, App) { 
    } 
); 
+0

Lo voté. No estoy de acuerdo con Jakee en este caso. – Constantine

+0

Estoy de acuerdo también. encapsular dependencias es el objetivo de AMD. Deberías hacerlo de esta manera –

+0

mientras que aquí tienes las variables encapsuladas, no conformas el principio de secado. Digamos que de repente 'app' tiene más dependencias que las que mencionaste allí. – Toskan

Cuestiones relacionadas