Skip to content

Instantly share code, notes, and snippets.

@jenweber
Forked from lifeart/controllers.application.js
Last active May 13, 2018 18:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jenweber/a1645a7d2c77d045ab622a16f72f38d5 to your computer and use it in GitHub Desktop.
Save jenweber/a1645a7d2c77d045ab622a16f72f38d5 to your computer and use it in GitHub Desktop.
Mapping debugging
import Ember from 'ember';
let RowItem = Ember.Object.extend({
order: 0
});
export default Ember.Controller.extend({
appName: 'Ember Twiddle',
sortDirection: '',
items: Ember.computed(function(){
return Ember.A([
RowItem.create({order:1}),
RowItem.create({order:2}),
RowItem.create({order:3}),
]);
}),
sortedItems: Ember.computed('items', 'sortDirection', function(){
let items = this.get('items');
if (this.get('sortDirection') === '') {
let mappedItems = items.mapBy('order');
console.log('going to return default sorted items, it should be 1, 2, 3');
console.log('mapped items:', mappedItems);
return items;
}
let result = this.get('items').sort(function(a, b) {
return a.get('order') - b.get('order');
});
if (this.get('sortDirection') === 'desc') {
return result.slice().reverse();
} else {
return result;
}
}),
actions: {
resetSort() {
this.set('sortDirection', '');
},
sort() {
if (this.get('sortDirection') === 'desc') {
this.set('sortDirection', 'asc');
} else {
this.set('sortDirection', 'desc');
}
}
}
});
<h1>Try click on "Sort" to get (3,2,1) and "Reset sorting"</h1>
<p>
Problem: mapBy on array not persistent
<br>
Given: <br>
* array of emberObjects, named "items". (for example, user list)<br>
* each item has "order" property<br>
* sortedItems - computed property, depended on "array", "sortDirection"<br>
<br>
How to reproduce:<br>
1.) Open gist.<br>
2.) By default no ordering for sortedItems<br>
3.) Click on "Sort" button. Now "sortedItems" has logic to return sorted array, instead of original "list"<br>
4.) Click on "Reset" button to get "original" sort (no sort).<br>
<br>
--== ERROR ==--<br>
<br>
Expected result:
<br>
"sortedItems" ordering must equal "Items" ordering
<br>
Output:
<br>
sortedItems has prev sort result, even for "list".mapBy('order') - is should return 1,2,3 but returns 3,2,1
</p>
<br>
<br>
{{outlet}}
<br>
<ul>
{{#each sortedItems as |item|}}
<li>{{item.order}}</li>
{{/each}}
</ul>
<button {{action 'sort'}}>Sort {{sortDirection}}</button>
<button {{action 'resetSort'}}>Reset sorting</button>
{
"version": "0.13.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.16.2",
"ember-template-compiler": "2.16.2",
"ember-testing": "2.16.2"
},
"addons": {
"ember-data": "2.16.3"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment