2011-11-02 28 views
9

¿Cuál es la mejor práctica para pasar variables bootstrapped dentro de la página representada (es decir, datos JSON o variables de configuración) a require.js para que puedan ser verificadas por un usado por dependencias?Pasando variables bootstrapped y JSON a require.js

Parece que esto podría hacerse mediante la comprobación de la window objeto (es decir window.bootstrapped_models pero eso no parece muy óptima

app.html -. Datos de ejemplo en el documento HTML

<script> 
var config = { 
    "isAdmin": true, 
    "userId": 1 
}; 
var bootstrapped_models = { 
    "groups": [ 
     { 
      "id": 1, 
      "name": "Foo" 
     }, 
     { 
      "id": 2, 
      "name": "Bar" 
     } 
    ] 
} 
</script> 

app.js - aplicación de ejemplo utilizando require()

require(['jquery', 'GroupCollection'], function($, GroupCollection) { 

    // extend default config 
    if (config) { 
     $.extend(defaults, config); 
    } 

    // use bootstrapped JSON here 
    var collection = new GroupCollection; 
    if (bootstrapped_models.groups.length > 0) { 
     collection.add(bootstrapped_models.groups); 
    } 

}); 

Respuesta

0

No estoy seguro si mi método es mejor practi ce, pero hago algo muy parecido a lo que está haciendo pero en lugar de embestir los modelos bootstrap en el objeto global, creo una definición para ello en mi página HTML:

<script type="text/javascript"> 
    define("bootstrappedModelJson", function() { 
     return @Html.Action("Controller", "RenderModel"); 
    }); 

    require({ 
     baseUrl: //etc. 
    }, ["app"], 
    function(){ 

    }); 
</script> 

entonces tengo un archivo js llama current.model que puede ser requerido por otros módulos y se ve así:

define(
[ 
    'require', 
    'model' 
], 
function (require, Model) 
{ 
    var json= require("bootstrappedModelJson"); 

    return new Model(json); 
}); 
6

La respuesta de @timDunham ha sido útil, pero se sentía un poco demasiado complicado para mí. Jugando con require.js y Lithium (PHP MVC) se me ocurrió lo siguiente. Es simple y ha funcionado en cada instancia que he encontrado.

<script type="text/javascript"> 
define('bootstrapData', function() { 
    return <?php echo json_encode($bootstrapData) ?>; 
}); 
</script> 

Cuál es entonces disponibles de la siguiente manera:

define(['bootstrapData'], function(bootstrapData) { 
    console.log(bootstrapData); // Will output your bootstrapped object 
}); 

Obviamente, la forma en que estoy con lo que los datos in es un lenguaje específico, pero el resto debe ser útil independientemente de su situación.

+0

gracias. su código es realmente útil –

+1

No pude conseguir que esto funcione con la optimización de mi js ... Intenté usar excludeShallow con el módulo boostrapData, pero cuando fui a compilarlo, todavía intenté encontrar un archivo bootstrapData. ¿Alguien puede explicar cómo lo hicieron funcionar? Soy bastante nuevo para require.js. Además, estoy usando requieren versión 1.0.1 (en caso de que eso haga la diferencia) –

0

pueda solucionar los problemas con optimizar el/la estructura mediante la desactivación de la bootstrapData en sus build.js como esto:

paths: { 
    bootstrapData: "empty:", 
Cuestiones relacionadas