2012-01-08 13 views
34

Qualcuno ha avuto molto successo con RequireJS ed Ember.js? Visto che a Ember piace avere la sua struttura assegnata a un oggetto globale, sto scoprendo che può davvero fare a pugni con Requirejs. Qualcosa come LAB.js funzionerà meglio con Ember?Ember.js e RequireJS

+0

Ho anche trovato requirejs difficile da usare con altre biblioteche e viceversa. Questo è il motivo per cui ho creato una libreria che è molto più facile da usare ed è testata con angolari. C'è un'applicazione demo in basso: gngeorgiev.github.io/Modulerr.js Puoi anche combinare tutti gli script in uno senza la dipendenza da Modulerr.js –

risposta

31

EDIT (2012-01-30): ho inviato un esempio più completo in un repo su bitbucket.

Ho usato con successo RequireJS per caricare Ember.js e l'addon datetime (github). Lo spazio dei nomi Ember rimane globale, ma tutti i dati della mia applicazione, inclusa la mia istanza di Ember.Application, sono conservati all'interno dei moduli attraverso RequireJS. Sto anche caricando i modelli manubri usando il 'testo!' collegare.

Non ho ancora avuto alcun problema, ma questa non è un'applicazione completa, più una dimostrazione del concetto. Ecco come l'ho fatto funzionare. Posso caricare la mia applicazione direttamente con Safari senza bisogno di un server. Avresti comunque bisogno di un server per caricarlo con Chrome, che non consente a JavaScript di caricare file dal filesystem.

1) Poiché Ember.js utilizza BPM/Spade, non è possibile utilizzare un clone del repository. Invece sto avvolgendo la versione compilata all'interno di un modulo:

lib/ember.js:

define(['jquery', 
     'plugins/order!lib/ember-0.9.3.js', 
     'plugins/order!lib/ember-datetime.js'], 
     function() { 
      return Ember; 
}); 

Si noti che questo di per sé non nasconde Ember dal campo di applicazione globale. Ma sto preparando le cose in modo che se in futuro potrò nasconderlo, ogni altro modulo che dipende da questo modulo funzionerà ancora così com'è.

2) I moduli possono fare riferimento a Ember in questo modo:

app/Core.js:

define(['lib/ember'], function(Em) { 
    MyApp = Em.Application.create({ 
     VERSION: "0.0.1" 
    }); 
    return MyApp; 
}); 

Qui, "Em" avrebbe potuto essere chiamato in qualche altro; non si riferisce direttamente alla variabile globale, ma proviene dal modulo definito in lib/ember.js.

3) siano accessibili da Ember, manubri devono essere registrati:

app/templates/my-template.handlebars:

MyApp v{{MyApp.VERSION}}. 

app/views/my- view.js:

define(['lib/ember', 
     'plugins/text!app/templates/my-template.handlebars'], 
     function(Em, myTemplateSource) { 

      Em.TEMPLATES["my-template"] = Em.Handlebars.compile(myTemplateSource); 

      var myView = Em.View.create({ 
       templateName: "my-template"; 
      }); 

      return myView; 
}); 

4) Sto usando require-jquery.js (jQuery e RequireJS raggruppati insieme).

+0

Quando segui il tuo approccio ottengo questo errore: Errore: Nome modulo 'ember -runtime 'non è stato ancora caricato per il contesto: _ Hai qualche idea su come risolverlo? sono fuori di idee :) –

+0

Forse hai un servizio pubblico di repo in cui posso guardare il tuo campione? questo sarebbe utile! –

+0

@ claude-precourt Sembra che MyApp sia dichiarata come variabile globale poiché non si utilizza la parola chiave var. Sei sicuro che funzioni anche senza utilizzare il contesto globale? –

8

C'è un modo migliore per includere un file manubrio che può avere più blocchi modello. Quale può essere compilato e disponibile in un solo include.

per esempio: avete il seguente file modello Manubrio:

../templates/sample.handlebars

<div><!-- just a filler html tag. Wont show up in your page --> 
    <script type="text/x-handlebars" data-template-name="template1"> 
     Some Html or Template Content ... 
    </script> 
    <script type="text/x-handlebars" data-template-name="template2"> 
     Some Html or Template Content ... 
    </script> 
    <script type="text/x-handlebars" data-template-name="template3"> 
     Some Html or Template Content ... 
    </script> 
</div> 

../views/sampleView.js

define([ 
    'jquery', 
    'lib/ember', 
    'plugins/text!../templates/sample.handlebars'], 
    function($, Em, myTemplateSource) { 

     // Bootstrap method accepts a context element under which all handlebars 
     // template blocks are defined. The filler <div> in this case. 
     // Compiles and assigns to the EM.TEMPLATES hash correctly. 
     Em.Handlebars.bootstrap($(myTemplateSource)); 

     var myView = Em.View.create({ 
      templateName: "template1"; 
     }); 

     return myView; 
}); 
+1

Molto elegante. L'uso di requireJS for Ember è una "migliore pratica" o più di un modo per organizzare progetti enormi? Sto davvero cercando un modo per strutturare il mio progetto, ma ho la brutta sensazione di avere un proxy che precarica tutto tutto il tempo. D'altra parte, è solo più chiaro in questo modo. – nembleton

3

Ember CLI supporta la sintassi del modulo ES6 che traspone su AMD. Sembra che la comunità si stia avvicinando alla CLI di Ember come il modo preferito di usare Ember.

http://www.ember-cli.com