Como devemos nos posicionar, em meio a tantas novidades ?
# Criando um novo projeto com o Ember cli
$ ember new workshop
# Entrando no diretório
$ cd workshop/
# Utilize dois terminais
# Em um deles utilize o watch
$ ember build --watch
# No outro o servidor
$ ember server
# Criando uma nova página
$ ember generate route about
# Verificar os arquivos alterados e criados
# app/router.js
# app/routes/about.js
# app/templates/about.hbs
<div>
<label>Nome:</label>
{{input type="text" value=name}}
</div>
<div>
<h3>Seu nome é {{name}}</h3>
</div>
app/templates/about.hbs
# Adiciona bootstrap ao seu projeto
$ ember install ember-bootstrap
<div class="container">
<div class="row">
<div class="col-md-12">
<nav class="navbar navbar-inverse">
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="/about">About</a></li>
</ul>
</div>
</nav>
</div>
</div>
{{content-for "body"}}
</div>
app/index.html
App = Ember.Application.extend({
// Adicionar as 3 linhas abaixo
LOG_TRANSITIONS: true,
LOG_TRANSITIONS_INTERNAL: true,
LOG_ACTIVE_GENERATION: true,
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix,
Resolver
});
app/app.js
Router.map(function() {
this.route('about');
// Adicionar as linhas abaixo
this.resource('contact', function() {
this.route('new');
});
});
// Após adiciona-las
// confira o ember inspector
app/router.js
import Ember from 'ember';
export default Ember.Route.extend({
init: function() {
Ember.Logger.debug("IndexRoute");
this._super();
}
});
app/routes/contact/index.js
import Ember from 'ember';
export default Ember.Controller.extend({
init: function() {
Ember.Logger.debug("IndexController");
this._super();
}
});
app/controllers/contact/index.js
ContactIndexTemplate
app/templates/contact/index.hbs
Router.map(function() {
this.route('about');
// Adicionar as linhas abaixo
this.route('contact', { resetNamespace: true }, function() {
this.route('new');
});
});
// Após alterar
// confira os logs novamente
app/router.js
Router.map(function() {
this.route('about');
this.route('contact', { resetNamespace: true }, function() {
this.route('new');
});
// Adicionar as linhas abaixo
this.route('book', { resetNamespace: true } ,function() {
this.route('new');
});
});
// Após alterar
// confira os logs novamente
app/router.js
<h1>Novo Livro</h1>
<form>
<div class="form-group">
<label for="title" class="col-sm-2 control-label">Título</label>
<div class="col-sm-10">
{{input type="text" name="title" class="form-control" value=title}}
</div>
</div>
<div class="form-group">
<label for="content" class="col-sm-2 control-label">Conteúdo</label>
<div class="col-sm-10">
{{input type="text" name="content" class="form-control" value=content}}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-primary" {{ action 'create' }}>Salvar</button>
</div>
</div>
</form>
app/templates/book/new.hbs
import Ember from 'ember';
export default Ember.Controller.extend({
title: '',
content: '',
actions: {
create: function(){
var title = this.get('title');
var content = this.get('content');
var _self = this;
Ember.$.ajax({
url: 'https://ember-api-workshop.herokuapp.com/books',
type: 'POST',
data: { book: { title: title, content: content, author_id: 1 } },
success: function() {
_self.transitionToRoute('book.index');
}
});
}
}
});
app/controllers/book/new.js
Router.map(function() {
this.route('about');
// Adicionar as linhas abaixo
this.route('contact', { resetNamespace: true }, function() {
this.route('new');
});
this.route('book', { resetNamespace: true } ,function() {
this.route('new');
this.route('edit', { path: 'edit/:id' });
});
});
// Após alterar
// confira os logs novamente
app/router.js
<h1>Editar Livro</h1>
<form>
<div class="form-group">
<label for="title" class="col-sm-2 control-label">Título</label>
<div class="col-sm-10">
{{input type="text" name="title" class="form-control" value=title}}
</div>
</div>
<div class="form-group">
<label for="content" class="col-sm-2 control-label">Conteúdo</label>
<div class="col-sm-10">
{{input type="text" name="content" class="form-control" value=content}}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-primary" {{ action 'update' }}>Atualizar</button>
</div>
</div>
</form>
app/templates/book/edit.hbs
import Ember from 'ember';
export default Ember.Route.extend({
model: function(params, controller) {
var url = "http://ember-api-workshop.herokuapp.com/books/" + params.id;
var model;
Ember.$.ajax({
url: url,
async: false,
success: function(data) {
model = data.books;
}
});
return model;
},
setupController: function(controller, model) {
this._super(controller, model);
controller.set('title', model.title);
controller.set('content', model.content);
controller.set('id', model.id);
}
});
app/routes/book/edit.js
import Ember from 'ember';
export default Ember.Controller.extend({
title: '',
content: '',
actions: {
update: function(){
var title = this.get('title');
var content = this.get('content');
var _self = this;
Ember.$.ajax({
url: 'https://ember-api-workshop.herokuapp.com/books/' + _self.id,
type: 'POST',
data: { book: { title: title,
content: content,
author_id: 1 }, _method: 'PUT' },
success: function() {
_self.transitionToRoute('book.index');
}
});
}
}
});
app/controllers/book/edit.js
import Ember from 'ember';
export default Ember.Route.extend({
setupController: function(controller, model) {
var url = "http://ember-api-workshop.herokuapp.com/books/";
var book;
Ember.$.ajax({
url: url,
async: false,
success: function(data) {
book = data.books;
}
});
Ember.Logger.debug(book);
this._super(controller, model);
controller.set('book', book);
}
});
app/routes/book/index.js
<table class="table">
<tr>
<th>Título</th>
<th>Conteúdo</th>
<th colspan="2"></th>
</tr>
<tr>
<td>{{ book.title }}</td>
<td>{{ book.content }}</td>
<td>{{#link-to 'book.edit' book.id }}Editar{{/link-to}}
</td>
</tr>
</table>
app/templates/book/index.hbs
<table class="table">
<tr>
<th>Título</th>
<th>Conteúdo</th>
<th colspan="2"></th>
</tr>
<tr>
<td>{{ book.title }}</td>
<td>{{ book.content }}</td>
<td>{{#link-to 'book.edit' book.id }}Editar{{/link-to}}
<td>{{#link-to 'book.delete' book.id }}Deletar{{/link-to}}</td>
</tr>
</table>
app/templates/book/index.hbs
Router.map(function() {
this.route('about');
// Adicionar as linhas abaixo
this.route('contact', { resetNamespace: true }, function() {
this.route('new');
});
this.route('book', { resetNamespace: true } ,function() {
this.route('new');
this.route('edit', { path: 'edit/:id' });
this.route('delete', { path: 'delete/:id' });
});
});
app/router.js
import Ember from 'ember';
export default Ember.Route.extend({
model: function(params, controller) {
var url = "http://ember-api-workshop.herokuapp.com/books/" +
params.id;
var model;
Ember.$.ajax({
url: url,
async: false,
type: 'POST',
data: { _method: 'DELETE' }
});
this.transitionTo('book.index');
return model;
}
});
app/routes/book/delete.js
$ ember g component double-click
import Ember from 'ember';
export default Ember.Component.extend({
doubleClick: function(){
alert("DoubleClick :) ");
}
});
app/components/double-click.js
{{yield}}
app/templates/components/double-click.hbs
{{#double-click}}
Clique aqui duas vezes
{{/double-click}}
app/templates/index.hbs
https://guides.emberjs.com/v2.7.0/components/the-component-lifecycle/#toc_formatting-component-attributes-with-code-didreceiveattrs-code