2012-04-22 21 views
6

He estado programando en Javascript por un tiempo. Recientemente hice un proyecto jQuery bastante grande y apliqué el Patrón de Módulo como se describe en este maravilloso artículo: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-DepthCómo extender espacios de nombres con EmberJS

Todo salió bien y el código se ve pulcro y manejable, pero sentí que podría ser mejor. Tengo pasan el día en busca de algunos marcos de Javascript, sobre todo los que: soporte de unión

  • Tienes IU
  • Tener un sistema de plantillas
  • puede trabajar con jQuery
  • ayudarme a organizar mi código en una de manera similar como lo hice con el patrón módulo

he encontré con marcos como AngularJS, KnockOutJS, SpineJS, JavascriptMVC, etc. el uno que realmente pegado a cabo - y fue muy elogiado - era EmberJS.

Decidí darle una oportunidad, pero no ha sido fácil. La disponibilidad de tutoriales para EmberJS es muy limitada. Después de intentar durante mucho tiempo logré hacer algunas cosas y me gusta lo que hace EmberJS. Solo hay una cosa que no puedo entender, que también es mi pregunta: ¿Cómo puedo extender un espacio de nombre Ember (hecho con Ember.Application.create)?

Como aclaración: La versión antigua de mi proyecto tenía un núcleo-nombre y un espacio Util-espacio de nombres. Ambos contenían sus funciones respectivas que todas las otras clases podrían usar. ¿Cómo puedo tener un espacio de nombres Core y Util con funciones sobre el espacio de nombres inicial?

No acabo de hacer:

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

O algo más?

Respuesta

10

No puede anidar Ember.Namespace 's (donde Ember.Application ser una subclase de Ember.Namespace), véase la edición #683.

Tome Dale, uno de los principales contribuyentes, agregó una respuesta interesante sobre el diseño de aplicaciones complejas, consulte el comment.

Así que puede simplemente usar App = Ember.Application.create() y crear sus controladores, vistas, etc. bajo este espacio de nombres. O se puede - si va a volver a utilizar algún código en otros proyectos/aplicaciones - como dividir el espacio de nombres de esto:

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 se extiende Ember.Namespace, y añade funcionalidad sobre el manejo de eventos (hacer clic, ...). Esto es útil cuando escribes una aplicación con vistas: en tu espacio de nombres Core y Util no necesitarías eso, por eso es solo y .

+0

Al principio, gracias por su rápida respuesta, muy detallada. En segundo lugar, realmente no me importan los espacios de nombres no anidados, simplemente estaba buscando la llamada a la función correcta para crear un objeto similar al espacio de nombres, ¡que es Ember.Namespace.Create! En todo caso, podría haber ido con mi enfoque de Patrón de Módulo para tener los espacios de nombres (anidados o no) en la parte superior de una aplicación Ember, pero eso es simplemente sucio. –

+0

Después de probarlo descubrí que los espacios de nombres de anidamiento realmente funcionan. Tal vez ha cambiado en una versión reciente debido a la demanda popular? –