2011-11-02 5 views
9

Co to jest najlepsza praktyka przekazywania zmiennych bootstrapowych w renderowanej stronie (to jest danych JSON lub zmiennych konfiguracyjnych) do require.js, aby można je było sprawdzić pod kątem używanych przez zaległości?Przekazywanie zmiennych bootstrapowych i JSON do require.js

Wygląda jak można to zrobić poprzez sprawdzenie obiektu window (tj window.bootstrapped_models ale to nie wydaje się bardzo optymalna

app.html. - przykładowe dane w dokumencie HTML

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

app.js - przykład aplikacji przy użyciu 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); 
    } 

}); 

Odpowiedz

0

Nie jestem pewien, czy moja metoda jest najlepsza ce, ale zrobić coś bardzo podobny do tego, co robisz, z wyjątkiem zamiast opierania się bootstrapped modele na światowym obiektu, tworzę zdefiniować go w moją stronę html:

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

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

    }); 
</script> 

następnie Mam plik js nazywa current.model które mogą być wymagane przez inne moduły i wygląda następująco:

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

    return new Model(json); 
}); 
6

Odpowiedź z @timDunham była pomocna, ale wydawało mi się to nieco skomplikowane. Grając z require.js i Lithium (PHP MVC) wymyśliłem następujące. To proste i działało w każdym przypadku, w którym się znalazłem.

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

który następnie jest dostępna w następujący sposób:

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

Oczywiście droga ja doprowadzenie danych jest specyficzny język, ale reszta powinna być użyteczny niezależnie od swojej sytuacji.

+0

podziękowania. Twój kod jest naprawdę pomocny –

+1

Nie mogłem tego użyć do optymalizacji mojego js ... Próbowałem użyć excludeShallow z modułem boostrapData, ale kiedy poszedłem do kompilacji, wciąż próbowałem znaleźć plik bootstrapData. Czy ktoś może wyjaśnić, w jaki sposób działa? Jestem całkiem nowym użytkownikiem require.js. Używam również wersji 1.0.1 (w przypadku, która robi różnicę) –

0

można rozwiązać problemy z Optimize/zbudować wyłączając bootstrapData w swoim build.js tak:

paths: { 
    bootstrapData: "empty:",