On Github luismendozamx / ember-intro
Luis Mendoza | @luismendozamxChelaJS | 13 de enero 2016
Originalmente SproutCore 2.0
Creado por Yehuda Katz y Tom Dale en 2011
Antes MVC, ahora MRCC*
Convention Over Configuration
* MRCC es un término mío, no es oficialProblema: Se volvio complejo y difícil de escalar.
Modelo: Representación de datos
Ruta: Cargar modelo, vista y controlador
Template: Definición de markup
Controlador: Conexión entre datos y template
Vista: Conexión al DOM y manejo de eventos
Influencia de React y Web Components
Ventajas: Reutilizable, aislado, menos redundate, menos confuso, más fácil de mantener.
ember-data
ember-cli
ember-inspector
Utilidad de línea de comandos para el desarrollo
$ ember new todo-app $ ember generate model todo $ ember serve $ ember build
Utilizada para manejar la información y estado de los modelos.
// Model const todo = DS.Model.extend({ title: DS.attr('string'), completed: DS.attr('booolean') }); // Store this.store.findAll('todo');
Router
Modelos
Rutas
Controladores
Templates
Componentes
/todos
/todos/new
/todos/:todo_id
Router.map(function() { this.route('todos', function() { this.route('new', { path: '/new' }); this.route('show', {path: '/:todo_id'}); }); });
// models/todo.js import DS from 'ember-data'; export default DS.Model.extend({ title: DS.attr('string'), completed: DS.attr('boolean'), description: DS.attr('string'), list: DS.belongsTo('list') });
// routes/todos/index.js import Ember from 'ember'; export default Ember.Route.extend({ model() { return this.store.findAll('todo'); // alternativamente: return $.getJSON('...') o $.ajax('...'); }, beforeModel() { /* código ejecutado antes de resolver el modelo */ }, actions: { updateTodo(todo) { todo.save(); } } });
/todos?page=1&sort=createdAt
// controllers/todos/index.js import Ember from 'ember'; export default Ember.Controller.extend({ queryParams: ['page', 'sort'], page: 1, sort: 'createdAt', asc: false, actions: { toggleSortDirection() { this.toggleProperty('asc'); } } });
{{! templates/todos/index.hbs }} {{#each model as |todo|}} <div> <p>{{todo.title}}</p> </div> {{/each}}
// components/add-todo-form.js import Ember from 'ember'; export default Ember.Component.extend({ todo: null, actions: { saveTodo(todo) { this.sendAction('saveTodo', todo); } } });
{{! templates/components/add-todo-form.hbs }} <form {{action 'saveTodo' todo on='submit'}}> {{input value=todo.title}} </form>
{{! templates/todos/new.hbs }} {{add-todo-form todo=model saveTodo='saveTodo'}}
// routes/todos/new.js ... model() { this.store.createRecord('todo', { completed: false }); }, actions: { saveTodo(todo) { todo.save().then(() => { // success }, () => { // error }); } } ...
Poderoso y completo.
Fuertes convenciones.
Estable, buena comunidad y muy buena documentación.
Sigue las mejores prácticas y aprende de otros.