Skip to content

Instantly share code, notes, and snippets.

@sukima
Last active June 17, 2019 05:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save sukima/32dbe2aac9d4ddecbde26b1d92fee401 to your computer and use it in GitHub Desktop.
Save sukima/32dbe2aac9d4ddecbde26b1d92fee401 to your computer and use it in GitHub Desktop.
[discus] REST API Example
import RESTAdapter from 'ember-data/adapters/rest';
export default RESTAdapter.extend({
namespace: '/api'
});
import ApplicationAdapter from './application';
export default ApplicationAdapter.extend({
pathForType() {
return 'responce';
},
urlForFindAll() {
return this.namespace + '/';
}
});
import Controller from '@ember/controller';
import { reads } from '@ember/object/computed';
export default Controller.extend({
pages: reads('model')
});
import Controller from '@ember/controller';
import { reads } from '@ember/object/computed';
export default Controller.extend({
pages: reads('model')
});
import Controller from '@ember/controller';
import { reads } from '@ember/object/computed';
export default Controller.extend({
posts: reads('model')
});
import Controller from '@ember/controller';
import { reads } from '@ember/object/computed';
export default Controller.extend({
pages: reads('model.responce')
});
import Controller from '@ember/controller';
import { reads } from '@ember/object/computed';
export default Controller.extend({
posts: reads('model.posts')
});
export default function() {
this.get('/api/', () => {
return {
responce: [
{ id: 0, title: 'main', content: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae, aliquam.' },
{ id: 1, title: 'about', content: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Provident, obcaecati? Accusantium ex dolorum voluptate deleniti?' },
{ id: 2, title: 'contacts', content: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptates voluptatibus exercitationem molestias rem.' }
]
};
});
this.get('/api/posts', () => {
return {
posts: [
{ id: 0, name: 'First', content: 'Lorem ipsum dolor sit amet consectetur adipisicing.' },
{ id: 1, name: 'Second', content: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Architecto quas quia distinctio ex consequuntur.' },
{ id: 2, name: 'Third', content: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Ullam, similique. Voluptatum, libero sequi.' }
]
};
});
}
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
export default Model.extend({
title: attr('string'),
content: attr('string')
});
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
export default Model.extend({
name: attr('string'),
content: attr('string')
});
import EmberRouter from '@ember/routing/router';
import config from './config/environment';
const Router = EmberRouter.extend({
location: 'none',
rootURL: config.rootURL
});
Router.map(function() {
this.route('xhr', function() {
this.route('posts');
});
this.route('ember-data', function() {
this.route('posts');
});
});
export default Router;
import Route from '@ember/routing/route';
export default Route.extend({
model() {
return this.store.findAll('page');
}
});
import Route from '@ember/routing/route';
export default Route.extend({
model() {
return this.store.findAll('post');
}
});
import Route from '@ember/routing/route';
import $ from 'jquery';
export default Route.extend({
model() {
return $.getJSON('/api/');
}
});
import Route from '@ember/routing/route';
import $ from 'jquery';
export default Route.extend({
model() {
return $.getJSON('/api/posts');
}
});
import RESTSerializer from 'ember-data/serializers/rest';
export default RESTSerializer.extend();
import ApplicationSerializer from './application';
export default ApplicationSerializer.extend({
modelNameFromPayloadKey() {
return 'page';
},
});
<div class="hack container">
<NavBar as |nav|>
<nav.item @route="xhr">XHR</nav.item>
<nav.item @route="ember-data">Ember Data</nav.item>
</NavBar>
{{outlet}}
</div>
<p>
<div class="loading"></div>
Loading&hellip;
</p>
<nav class="btn-group">
{{yield (hash
item=(component "nav-item")
)}}
</nav>
{{#link-to @route
tagName="button"
class="btn btn-default btn-ghost"
activeClass="btn-primary"
}}
{{yield}}
{{/link-to}}
<h1>Ember Data Example</h1>
<NavBar as |nav|>
<nav.item @route="ember-data.index">Pages</nav.item>
<nav.item @route="ember-data.posts">Posts</nav.item>
</NavBar>
{{outlet}}
<h2>Pages</h2>
<table>
<thead>
<tr><th>ID</th><th>Title</th><th>Content</th></tr>
</thead>
<tbody>
{{#each pages as |page|}}
<tr>
<td><code>{{page.id}}</code></td>
<td>{{page.title}}</td>
<td>{{page.content}}</td>
</tr>
{{else}}
<tr><td colspan="3"><center>No pages available</center></td></tr>
{{/each}}
</tbody>
</table>
<h2>Posts</h2>
<table>
<thead>
<tr><th>ID</th><th>Name</th><th>Content</th></tr>
</thead>
<tbody>
{{#each posts as |post|}}
<tr>
<td><code>{{post.id}}</code></td>
<td>{{post.name}}</td>
<td>{{post.content}}</td>
</tr>
{{else}}
<tr><td colspan="3"><center>No posts available</center></td></tr>
{{/each}}
</tbody>
</table>
<p>
This twiddle is broken in to two examples: {{link-to "Native XHR" "xhr"}} and {{link-to "Ember Data" "ember-data"}}. Each has two child routes that demonstrate the <code>/</code> and <code>/posts</code> API endpoints.
</p>
<h1>XMLHttpRequest Example</h1>
<NavBar as |nav|>
<nav.item @route="xhr.index">Pages</nav.item>
<nav.item @route="xhr.posts">Posts</nav.item>
</NavBar>
{{outlet}}
<h2>Pages</h2>
<table>
<thead>
<tr><th>ID</th><th>Title</th><th>Content</th></tr>
</thead>
<tbody>
{{#each pages as |page|}}
<tr>
<td><code>{{page.id}}</code></td>
<td>{{page.title}}</td>
<td>{{page.content}}</td>
</tr>
{{else}}
<tr><td colspan="3"><center>No pages available</center></td></tr>
{{/each}}
</tbody>
</table>
<h2>Posts</h2>
<table>
<thead>
<tr><th>ID</th><th>Name</th><th>Content</th></tr>
</thead>
<tbody>
{{#each posts as |post|}}
<tr>
<td><code>{{post.id}}</code></td>
<td>{{post.name}}</td>
<td>{{post.content}}</td>
</tr>
{{else}}
<tr><td colspan="3"><center>No posts available</center></td></tr>
{{/each}}
</tbody>
</table>
{
"version": "0.15.1",
"EmberENV": {
"FEATURES": {}
},
"ENV": {
"ember-cli-mirage": { "enabled": true }
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"hack_css": "https://cdnjs.cloudflare.com/ajax/libs/hack/0.8.0/hack.css",
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js",
"ember": "3.4.3",
"ember-template-compiler": "3.4.3",
"ember-testing": "3.4.3"
},
"addons": {
"ember-data": "3.4.2",
"ember-cli-mirage": "0.4.9"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment