Skip to content

Instantly share code, notes, and snippets.

@EWhite613
Forked from alexspeller/controllers.application.js
Last active December 13, 2018 17:31
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 EWhite613/82277f779c4c0728a980f938f48d02c8 to your computer and use it in GitHub Desktop.
Save EWhite613/82277f779c4c0728a980f938f48d02c8 to your computer and use it in GitHub Desktop.
issue (solved)
import Ember from 'ember';
const {computed} = Ember;
let aCount = 0;
let bCount = 0;
let stableComputedKey = 0;
function stableComputed(...dependentKeys) {
let func = dependentKeys.pop();
let installed = false;
let oldValues = [];
let uniqueKey = `stableComputed-${stableComputedKey}`;
if (dependentKeys.any(k => k.includes('@') || k.includes('[]'))) {
throw new Error("Does not support array dependent keys");
}
stableComputedKey += 1;
return computed(uniqueKey, function(...compArgs) {
if (!installed) {
// Should be done for every dependent key
this.addObserver(dependentKeys[0], this, function() {
let newValues = dependentKeys.map(k => this.get(k));
if (!newValues.every((value, i) => oldValues[i] === value)) {
this.notifyPropertyChange(uniqueKey);
}
oldValues = newValues;
});
installed = true;
oldValues = dependentKeys.map(k => this.get(k));
}
return func.apply(this, compArgs);
});
}
export default Ember.Controller.extend({
appName: 'Ember Twiddle',
value: 'initial',
constant: 'always the same',
neverChangingProperty: computed('value', 'constant', function() {
return this.get('constant')
}),
a: stableComputed('neverChangingProperty', function() {
this.get('neverChangingProperty');
aCount += 1;
return aCount;
}),
b: computed('value', function() {
bCount += 1;
return bCount;
}),
actions: {
changeValue() {
this.set('constant', Math.random())
},
updateValue() {
this.set('value', Math.random())
},
updateNeverChanging() {
this.set('neverChangingProperty', Math.random())
}
}
});
<h1>Welcome to {{appName}}</h1>
<br>
<br>
{{outlet}}
<br>
<br>
a: {{a}}
<br>
b: {{b}}
<br>
value: {{value}}
<button {{action 'updateValue'}}>Update value</button>
<button {{action 'changeValue'}}>Change value</button>
{{neverChangingProperty}}
{
"version": "0.15.0",
"EmberENV": {
"FEATURES": {}
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js",
"ember": "3.2.2",
"ember-template-compiler": "3.2.2",
"ember-testing": "3.2.2"
},
"addons": {
"ember-data": "3.2.0"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment