2012-04-22 5 views
6

Ho programmato in Javascript per un po '. Recentemente ho realizzato un progetto jQuery abbastanza grande e ho applicato il Pattern del modulo come descritto in questo meraviglioso articolo: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-DepthCome estendere gli spazi dei nomi con EmberJS

Questo è andato tutto bene e dandy e il codice sembra sdolcinato e gestibile, ma ho sentito che potrebbe essere migliore. Ho trascorrere la giornata alla ricerca di alcuni framework JavaScript, per lo più quelli che:

  • Hanno UI supporto vincolante
  • dispone di un sistema di templating
  • può lavorare con jQuery
  • aiutarmi ad organizzare il mio codice in un modo simile come ho fatto con il modello di modulo di

ho inciampato attraverso quadri come AngularJS, KnockOutJS, SpineJS, JavascriptMVC, ecc quello che realmente incollato fuori - ed è stato molto lodato - era EmberJS.

Ho deciso di fare un tentativo, ma non è stato facile. La disponibilità di tutorial per EmberJS è molto limitata. Dopo aver provato per molto tempo sono riuscito a far funzionare alcune cose e mi piace quello che fa EmberJS! C'è solo una cosa che non riesco a capire - che è anche la mia domanda: Come posso estendere uno spazio dei nomi Ember (creato con Ember.Application.create)?

Per chiarimenti: La vecchia versione del mio progetto aveva uno spazio dei nomi Core e uno spazio dei nomi Util. Entrambi contenevano le rispettive funzioni che tutte le altre classi potevano usare. Come posso avere uno spazio dei nomi Core e Util con funzioni in cima allo spazio dei nomi iniziale?

Devo solo fare:

MyNamespace = Ember.Application.create(); 
MyNamespace.Core = Ember.Application.create(); 
MyNamespace.Util = Ember.Application.create(); 

O qualcos'altro?

risposta

10

Non si può annidare Ember.Namespace 's (dove Ember.Application essere una sottoclasse di Ember.Namespace), vedi problema #683.

Tome Dale, uno dei contributori principali, ha aggiunto una risposta interessante sul layout di applicazioni complesse, vedere comment.

Quindi è possibile utilizzare solo App = Ember.Application.create() e creare i controllori, viste, ecc in questo spazio dei nomi. Oppure è possibile - se si intende riutilizzare un certo codice in altri progetti/applicazioni - dividere il namespace in questo modo:

Util = Ember.Namespace.create({ 
    importantNames: 'Einstein'.w() 
}); 

Core = Ember.Namespace.create({ 
    sqrt: function(x) { return Math.sqrt(x); } 
}); 

App = Ember.Application.create(); 

... 

App.myListController = Ember.Object.create({ 
    importantNamesBinding: 'Core.importantNames', 
    sqrtBinding: 'Util.sqrt' 
}); 

Un Ember.Application estende Ember.Namespace, e aggiunge funzionalità sulla gestione degli eventi (clicca, ...). Questa roba è utile quando si scrive un'applicazione con vista - nel vostro Core e Util spazio dei nomi che non avrebbe bisogno quella roba, è per questo che questo è solo un Ember.Namespace.

+0

In un primo momento, grazie per la risposta rapida, molto dettagliato. In secondo luogo, non mi importa namespace non nidificati, stavo solo cercando la chiamata di funzione a destra per creare un oggetto spazio dei nomi simile, che è Ember.Namespace.Create! Se mai, avrei potuto usare il mio approccio Pattern per avere gli spazi dei nomi (sia nidificati che non) sopra un'applicazione Ember, ma è solo sporco. –

+0

Dopo averlo provato, ho scoperto che i namespace di nesting funzionano davvero. Forse è cambiato in una versione recente a causa della grande richiesta? –