Skip to content

Instantly share code, notes, and snippets.

@mfeckie
Last active September 23, 2020 14:03
Show Gist options
  • Save mfeckie/9a887d0edf25027edade31f759e2e9be to your computer and use it in GitHub Desktop.
Save mfeckie/9a887d0edf25027edade31f759e2e9be to your computer and use it in GitHub Desktop.
Query Param issue reproduction
import Controller from '@ember/controller';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';
export default class ApplicationController extends Controller {
appName = 'Ember Twiddle';
queryParams = ['search', 'statuses'];
search = '';
statuses = [];
@action
toggleStatus(status) {
if (this.statuses.includes(status)) {
this.statuses.removeObject(status);
} else {
this.statuses.pushObject(status);
}
console.log('statuses: ', this.statuses);
}
}
import Route from '@ember/routing/route';
export default class ApplicationRoute extends Route {
queryParams = {
statuses: {
refreshModel: true
},
search: {
refreshModel: true
}
};
async model() {
await new Promise((resolve) => setTimeout(resolve, 2000));
}
serializeQueryParam(value, urlKey, defaultValueType) {
console.log(`serializeQuery params: "${value}"\ntype:${typeof value}\ndefaultValueType: ${defaultValueType}`);
return super.serializeQueryParam(...arguments);
}
deserializeQueryParam(value, urlKey, defaultValueType) {
console.log(`deserializeQuery params: "${value}"\ntype:${typeof value}\ndefaultValueType: ${defaultValueType}`);
return super.deserializeQueryParam(...arguments);
}
}
<h1>Query Parameter Breakage Repro</h1>
<p>Click any of the checkboxes and whilst the timeout is happening (2 seconds), enter something into the search text input.</p>
<p>Note in the browser console how the array has become a string</p>
<b>IF YOU TYPE TOO MANY KEYSTROKES IT WILL CRASH THE BROWSER!</b>
<br/>
<br/>
<label for='good'>Good</label>
<Input id='good' type="checkbox" @change={{fn this.toggleStatus 'good'}} @value={{this.good}} />
<label for='bad'>Bad</label>
<Input id='bad' type="checkbox" @change={{fn this.toggleStatus 'bad'}} @value={{this.bad}} />
<label for='other'>Undecided</label>
<Input id='other' type="checkbox" @change={{fn this.toggleStatus 'undecided'}} @value={{this.undecided}}/>
<Input @value={{this.search}} placeholder="Search stuff" />
<pre>
Statuses:
{{this.statuses}}
</pre>
{
"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.18.1",
"ember-template-compiler": "3.18.1",
"ember-testing": "3.18.1"
},
"addons": {
"@glimmer/component": "1.0.0"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment