Skip to content

Instantly share code, notes, and snippets.

@jacobq
Last active October 13, 2017 02:32
Show Gist options
  • Save jacobq/2f0db50ac3afb8dd01c11ab0345f010f to your computer and use it in GitHub Desktop.
Save jacobq/2f0db50ac3afb8dd01c11ab0345f010f to your computer and use it in GitHub Desktop.
Data Relationships
import LSAdapter from 'ember-localstorage-adapter';
export default LSAdapter.extend({
namespace: 'twiddleApp'
});
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'select'
});
import Ember from 'ember';
export default Ember.Controller.extend({
appName: 'Data relationship demo'
});
import RSVP from 'rsvp';
export function initialize(appInstance) {
const store = appInstance.lookup('service:store');
//console.log('DEBUG: creating initial store entries');
const promises = [];
// Leak the store for debugging / testing
window.debug = {
store
};
// Roles
let camera = store.createRecord('role', {
name: 'Camera',
})
// Drivers
let usbCamera = store.createRecord('driver', {
name: 'USB camera',
roles: [ camera ]
})
promises.push(usbCamera.save());
let networkCamera = store.createRecord('driver', {
name: 'Network camera',
roles: [ camera ]
})
promises.push(networkCamera.save());
camera.set('drivers', [ usbCamera, networkCamera ]);
promises.push(camera.save());
// Devices
let device = store.createRecord('device', {
name: 'Camera 1',
driver: usbCamera
})
promises.push(device.save());
device = store.createRecord('device', {
name: 'Camera 2',
driver: usbCamera
})
promises.push(device.save());
device = store.createRecord('device', {
name: 'Camera 3',
driver: networkCamera
})
promises.push(device.save());
return RSVP.all(promises);
}
export default {
name: 'create-store-entries',
after: 'ember-data',
initialize
};
import Model from "ember-data/model";
import attr from "ember-data/attr";
import { belongsTo, hasMany } from "ember-data/relationships";
export default Model.extend({
name: attr('string'),
driver: belongsTo('driver'),
});
import Model from "ember-data/model";
import attr from "ember-data/attr";
import { belongsTo, hasMany } from "ember-data/relationships";
export default Model.extend({
name: attr('string'),
devices: hasMany('device'),
roles: hasMany('role'),
});
import Model from "ember-data/model";
import attr from "ember-data/attr";
import { belongsTo, hasMany } from "ember-data/relationships";
export default Model.extend({
name: attr('string'),
driver: belongsTo('driver')
});
import Ember from 'ember';
import RSVP from 'rsvp';
export default Ember.Route.extend({
model() {
return RSVP.hash({
roles: this.get('store').findAll('role'),
devices: this.get('store').findAll('device'),
drivers: this.get('store').findAll('driver')
})
}
});
import { LSSerializer } from 'ember-localstorage-adapter';
export default LSSerializer.extend();
<h1>{{appName}}</h1>
<h2>Roles</h2>
<ul>
{{#each model.roles as |role|}}
{{!log 'role' role}}
<li>{{role.name}} has the following drivers:
<ul>{{#each role.drivers as |driver|}}
{{!log 'driver' driver}}
<li>{{driver.name}} is used by the following devices:
<ul>{{#each driver.devices as |device|}}
{{!log 'device' device}}
<li>{{device.name}}</li>
{{/each}}</ul>
</li>
{{/each}}</ul>
<br>
FIXME: How can I make a drop-down of all {{role.name}} instances here? {{drop-down options=getOptions}}
</li>
{{/each}}
</ul>
<br>
{{outlet}}
<br>
{{#each options as |option|}}
{{log 'option' option}}
<option value={{option.value}} selected={{option.isSelected}}>{{option.name}}</option>
{{/each}}
import Ember from 'ember';
export default function destroyApp(application) {
Ember.run(application, 'destroy');
}
import Resolver from '../../resolver';
import config from '../../config/environment';
const resolver = Resolver.create();
resolver.namespace = {
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix
};
export default resolver;
import Ember from 'ember';
import Application from '../../app';
import config from '../../config/environment';
const { run } = Ember;
const assign = Ember.assign || Ember.merge;
export default function startApp(attrs) {
let application;
let attributes = assign({rootElement: "#test-root"}, config.APP);
attributes = assign(attributes, attrs); // use defaults, but you can override;
run(() => {
application = Application.create(attributes);
application.setupForTesting();
application.injectTestHelpers();
});
return application;
}
import resolver from './helpers/resolver';
import {
setResolver
} from 'ember-qunit';
setResolver(resolver);
{
"version": "0.12.1",
"EmberENV": {
"FEATURES": {}
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.js",
"ember": "2.12.0",
"ember-template-compiler": "2.12.0",
"ember-testing": "2.12.0"
},
"addons": {
"ember-data": "2.12.1",
"ember-localstorage-adapter": "1.0.0"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment