2012-01-20 12 views
42

Estoy mirando Ember.js y he estado leyendo los documentos para tratar de entender cómo usarlo. Lo entiendo (bastante bien), excepto por una cosa. A mi modo de ver en el patrón MVC, el Modelo es el repositorio de datos en la aplicación. Puedo ver cómo funciona eso para los datos del lado del cliente en Ember.js. Lo que no entiendo es cómo vincular esos datos al servidor para que, si los datos cambian en el cliente, los cambios se actualicen en el servidor. Y viceversa. He estado haciendo esto en mis aplicaciones web haciendo llamadas de Ajax/JSON al servidor, no estoy obteniendo cómo hacerlo con Ember.js.ember.js y el servidor

Respuesta

51

Excavar un poco alrededor emberjs on GitHub he encontrado esto: https://github.com/emberjs/data:

Ember datos es una biblioteca para los modelos de carga de una capa de persistencia (tales como una API JSON), la actualización de los modelos, a continuación, guardar los cambios. Proporciona muchas de las instalaciones que encontrará en los ORM del lado del servidor como ActiveRecord, pero está diseñado específicamente para el entorno único de JavaScript en el navegador.

También sugiero leer Ember.js Live Collections. Lo que se quiere es tener una colección de modelos que saber cómo sincronizar con el lado del servidor, es posible código de ejemplo es:

// our model 
App.Person = Ember.Object.extend(); 

App.people = Ember.ArrayController.create({ 
    content: [], 
    save: function() { 
    // assuming you are using jQuery, but could be other AJAX/DOM framework 
    $.post({ 
     url: "/people", 
     data: JSON.stringify(this.toArray()), 
     success: function (data) { 
     // your data should already be rendered with latest changes 
     // however, you might want to change status from something to "saved" etc. 
     } 
    }); 
    } 
}); 

Se podría entonces llamar App.people.save() en las ocasiones necesarias.

También asegúrese de revisar este artículo, Advice on & Instruction in the Use Of Ember.js, que profundiza en la comunicación servidor-cliente con Ember y también menciona emberjs/data.

Nota: La Biblioteca de datos Emberjs se debe utilizar con precaución por el hecho de que no está lista para producción.

+1

Gracias por la gran respuesta, muy útil y el artículo que hace referencia me será útil. En cierto modo, la forma en que Ember.js se utiliza en el lado del cliente es algo así como el patrón de mediador/colega, que es útil para gestionar los cambios en los cuadros de diálogo de una GUI. Tus sugerencias anteriores me ayudarán a unir ese tipo de cosas para mantener el servidor/cliente sincronizado. De nuevo, muchas gracias! –

+0

No creo que los datos de aserciones se pongan en uso en este momento, ya que se indica claramente que se trata de TRABAJOS EN CURSO y de parte de DESARROLLO RÁPIDO para emberjs. Creo que una alternativa estable será genial. –

+0

@ aleatorio, el enlace a trek es definitivamente valioso allí, tiene un enlace a una versión anterior de un artículo que es muy educativo y le da a la gente la idea de cómo hacer la comunicación cliente-servidor en la brasa. Poniéndolo de vuelta. –

6

En Ember.js, el "modelo" contenido en el objeto Ember contendrá una abstracción adicional de una base de datos subyacente del lado del servidor, si está utilizando una. La parte del controlador de la aplicación debe tener métodos que le permitan recuperar y enviar datos que se llaman cuando sea necesario para actualizar el modelo (usando Ajax). Esto es bueno porque tienes un modelo que puede responder rápidamente en el lado del cliente a cualquier entrada que el usuario proporcione a la aplicación (teclas, movimientos del mouse, lo que sea) y elegir selectivamente cuándo realizar consultas relativamente costosas a una base de datos del servidor, por ejemplo. De esta forma, parte del rendimiento de la aplicación ya no se ve obstaculizado por la latencia de las solicitudes de datos a un servidor externo, que en algunos casos puede permitirle crear aplicaciones cuya capacidad de respuesta se aproxima a la de las aplicaciones nativas.

+7

DOM es Document Modelo de objeto y se refiere generalmente a la representación en árbol de los elementos HTML (o XML) y su API. En Ember.js el modelo no está almacenado en el DOM y no es una buena idea almacenar sus datos en DOM - DOM es la parte más lenta de la API del navegador JavaScript. Quizás puedas almacenar enlaces en DOM (como knockout.js), pero no el modelo en sí. Esta es la razón por la que todo el cambio de jQuery se está realizando en este momento: no almacenar el estado de los datos y los datos en DOM. –

+0

@gryzzly: ¿alguna referencia de artículo/debate a DOM es más lenta y problemas con jQuery? – theringostarrs

+0

¡Quizás para su uso, jQuery y DOM estén bien! Cuando leí por primera vez la descripción de BackboneJS: "Al trabajar en una aplicación web que implica mucho JavaScript, una de las primeras cosas que aprende es dejar de vincular sus datos al DOM.Es muy fácil crear aplicaciones JavaScript que terminan como montones enredados de selectores y devoluciones de llamada de jQuery, todos intentando frenéticamente mantener los datos sincronizados entre la interfaz de usuario HTML, su lógica de JavaScript y la base de datos en su servidor. Para aplicaciones ricas del lado del cliente, un enfoque más estructurado a menudo es útil. "Coincidió exactamente con mis pensamientos. –

5

me gusta imaginar Ember.js en pares como esto

  • Vistas y plantillas están correlacionados (obviamente), ajustar los puntos de vista de clase para controlar la plantilla (como los nombres de las clases)
  • router y Rutas funciona un poco como el controlador en MVC. Son responsables de enrutar la solicitud al punto final correcto
  • El controlador y el modelo están centrados en el modelo, uno (el Modelo) describe los datos que manejará en su aplicación mientras el controlador se comporta como un tipo de proxy (o decorador, si eso es más arriba en tu callejón).Plantillas enlazará con el controlador por ejemplo y

Básicamente eso significa cargar su controlador (sola o matriz) con un modelo y ahora se puede modelar fácilmente los procesos de trabajo en ese modelo (es decir, las cosas que no lo hace toque el modelo en su núcleo/datos) en su controlador. Para una aplicación de blog ejemplo, usted podría describir la Mensaje en el modelo y añadir algo por el estilo para el controlador

App.PostController = Ember.ObjectController.extend({ 
    content: null, 

    // initial value 
    isExpanded: false, 

    expand: function() { 
    this.set('isExpanded', true) 
    }, 

    contract: function() { 
    this.set('isExpanded', false) 
    } 
}); 

Ahora puede interactuar con el represenation del modelo en términos de interfaz de pensamiento a través del controlador . Expandir una publicación o no no cambia el modelo, solo cambia los datos.

En cuanto a la recarga de datos desde el servidor, tengo dos respuestas para usted

  1. me encontré this article muy útiles en la comprensión de las conexiones (y de votación simple, aunque sea sencilla)
  2. Si está utilizando rieles, que tenga suerte con los próximos 4 raíles en vivo, ver this post and demo para las partes jugosas
1

me di cuenta que es un poco viejo de una pregunta, pero es en la página de mayor audiencia para ember.js, por lo que pensé que agregaría un poco.

He estado usando ember-model últimamente para manejar el enlace de datos RESTful. Tiene menos campanas y silbatos, pero para mis necesidades es bastante decente. Básicamente, simplemente amplía la funcionalidad del modelo para integrarse razonablemente bien con un servidor que empuja los objetos JSON a través de una interfaz REST estándar.