Luis Mendoza | @luismendozamx
ChelaJS | 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.