Skip to content

Instantly share code, notes, and snippets.

@korneev-andrew
Forked from lifeart/controllers.application\.js
Last active November 18, 2020 13:45
Show Gist options
  • Save korneev-andrew/ed17ef8abcdfca94599b2e5aa385485d to your computer and use it in GitHub Desktop.
Save korneev-andrew/ed17ef8abcdfca94599b2e5aa385485d to your computer and use it in GitHub Desktop.
Pushing new meta-attr
import Controller from '@ember/controller';
import { action } from '@ember/object';
import { inject as service } from '@ember/service';
export default class ApplicationController extends Controller {
appName = 'Ember Twiddle';
@service('store') store;
constructor() {
super(...arguments);
this.setup();
}
@action setup() {
this.store.pushPayload({
included: [
{id: '1', type: 'meta-attribute', attributes: { value: 'a', name: 'firstname' } }, {id: '2', type: 'meta-attribute', attributes: { value: 'b', name: 'lastname' } }
],
data: {
id: '1',
type: 'meta-model',
relationships: {
'meta-attributes': {
data: [
{id: '1', type: 'meta-attribute'},
{id: '2', type: 'meta-attribute'},
]
}
}
}
});
this.set('items', this.store.peekAll('meta-model'));
}
@action pushMiddleName() {
const model = this.store.peekRecord('meta-model', '1');
this.store.createRecord('meta-attribute', {
id: '3',
value: 'c',
name: 'middlename',
parent: model,
});
}
}
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo } from 'ember-data/relationships';
export default class extends Model {
@attr('string') value;
@attr('string') name;
@belongsTo('meta-model', { async: false, polymorphic: true, inverse: 'metaAttributes' })
parent;
}
import Model from 'ember-data/model';
import { belongsTo, hasMany } from 'ember-data/relationships';
import EmberObject, { computed, defineProperty, get } from '@ember/object';
import { alias } from '@ember/object/computed';
import { camelize } from '@ember/string';
const ATTR_MODEL_PREFIX = '_model_';
function computedAttrs() {
const attrsList = EmberObject.create({});
const data = this.metaAttributes.reduce(
(result, model) => {
const propName = camelize(get(model, 'name'));
defineProperty(
result,
`${ATTR_MODEL_PREFIX}${propName}`,
computed(function() {
return model;
})
);
defineProperty(
result,
propName,
alias(`${ATTR_MODEL_PREFIX}${propName}.value`)
);
return result;
},
attrsList
);
return data;
}
export default class extends Model.extend({
attrs: computed('metaAttributes.@each.name', computedAttrs),
attrModelsHash: computed('attrs', function() {
const attrsMap = EmberObject.create({
attrs: this.attrs
});
this.attrNames.forEach((attrName) => {
defineProperty(
attrsMap,
attrName,
alias(`attrs.${ATTR_MODEL_PREFIX}${attrName}`)
);
});
console.log(attrsMap);
return attrsMap;
}),
attrNames: computed('attrs', function() {
return Object.keys(get(this, 'attrs')).filter((name) => {
return !name.startsWith(ATTR_MODEL_PREFIX);
});
}),
firstname: alias('attrModelsHash.firstname.value'),
lastname: alias('attrModelsHash.lastname.value'),
middlename: alias('attrModelsHash.middlename.value')
}) {
@hasMany('meta-attribute', { async: false, inverse: 'parent', polymorphic: true })
metaAttributes;
}
<button {{on "click" this.setup}}>Setup</button>
<button disabled={{this.items.firsObject.middlename}} {{on "click" this.pushMiddleName}}>Push Middle Name</button>
<br>
Items: {{this.items.length}}
<br>
Firstname: {{this.items.firstObject.firstname}}
<br>
Lastname: {{this.items.firstObject.lastname}}
<br>
Middlename: {{this.items.firsObject.middlename}}
<br>
Attrs:
<br>
{{#each this.items.firstObject.metaAttributes as |model|}}
<Input @value={{model.value}} /><br>
{{/each}}
{
"version": "0.17.1",
"EmberENV": {
"FEATURES": {},
"_TEMPLATE_ONLY_GLIMMER_COMPONENTS": false,
"_APPLICATION_TEMPLATE_WRAPPER": true,
"_JQUERY_INTEGRATION": true
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js",
"ember": "3.12.2",
"ember-template-compiler": "3.12.2",
"ember-testing": "3.12.2"
},
"addons": {
"@glimmer/component": "1.0.0",
"ember-data": "3.12.5"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment