Skip to content

Instantly share code, notes, and snippets.

@tarponjargon
Last active February 19, 2017 21:13
Show Gist options
  • Select an option

  • Save tarponjargon/fb1680bfea201aeb4a0d886aafa3eed5 to your computer and use it in GitHub Desktop.

Select an option

Save tarponjargon/fb1680bfea201aeb4a0d886aafa3eed5 to your computer and use it in GitHub Desktop.

Revisions

  1. tarponjargon revised this gist Feb 19, 2017. 2 changed files with 14 additions and 35 deletions.
    20 changes: 7 additions & 13 deletions controllers.results.js
    Original file line number Diff line number Diff line change
    @@ -1,25 +1,19 @@
    import Ember from 'ember';

    // this would not be here, I'd import it to both the route and the controller (perhaps from environment.js)
    const cfg = {
    defaultQueryParams: {
    q: null,
    sort_method: 'relevance', //<--when added with setProperties in init() - strings are added just fine
    filter1: [], // <--when added with setProperties in init() - arrays are added as 'undefined'
    filter2: []
    }
    };

    export default Ember.Controller.extend({

    queryParams: Object.keys(cfg.defaultQueryParams), // <--this works just fine, no need to manually specify
    queryParams: ['q','sort_method','search_type','filter1','filter2'],

    init(){
    this._super(...arguments);
    this.setProperties(cfg.defaultQueryParams); // <--works for setting strings, but not arrays

    Ember.set(this, 'q', null);
    Ember.set(this, 'sort_method', 'relevance'); // <-- sets default value to 'undefined'
    Ember.set(this, 'filter1', []); // <-- sets default value to 'undefined'
    },

    filter2: [], // <--when added directly, arrays are added as 'Array[0]'
    filter2: [], // <-- sets default value to 'Array[0]'
    search_type: 'bar', // <-- sets default value properly

    actions: {
    addFilter: function(key, value) {
    29 changes: 7 additions & 22 deletions routes.results.js
    Original file line number Diff line number Diff line change
    @@ -1,26 +1,11 @@
    import Ember from 'ember';

    // this would not be here, I'd import it to both the route and the controller (perhaps from environment.js)
    const cfg = {
    defaultQueryParams: {
    q: null,
    sort_method: 'relevance',
    filter1: [],
    filter2: []
    }
    };

    export default Ember.Route.extend({
    queryParams: {},
    init() {
    this._super(...arguments);

    //specify from cfg.defaultQueryParams rather than each one explicitly
    Object.keys(cfg.defaultQueryParams).forEach((qp) => {
    this.queryParams[qp] = { refreshModel: true };
    });

    // setting each queryParams `refreshModel: true` using a loop does work! yay! See console:
    console.log("ROUTE queryParams:", this.queryParams);
    }
    queryParams: {
    q: { refreshModel: true },
    sort_method: { refreshModel: true },
    search_type: { refreshModel: true },
    filter1: { refreshModel: true },
    filter2: { refreshModel: true }
    }
    });
  2. tarponjargon revised this gist Feb 19, 2017. 5 changed files with 29 additions and 96 deletions.
    29 changes: 11 additions & 18 deletions controllers.results.js
    Original file line number Diff line number Diff line change
    @@ -1,38 +1,31 @@
    import Ember from 'ember';

    // this would not be here, I'd import it to the route and the controller
    // this would not be here, I'd import it to both the route and the controller (perhaps from environment.js)
    const cfg = {
    defaultQueryParams: {
    q: null,
    paging: '18',
    search_sort: 'relevance',
    search_title: null,
    search_page: null,
    filter_breadcrumb: [],
    filter_price: [],
    filter_size_apparel: [],
    filter_color: []
    sort_method: 'relevance', //<--when added with setProperties in init() - strings are added just fine
    filter1: [], // <--when added with setProperties in init() - arrays are added as 'undefined'
    filter2: []
    }
    };

    export default Ember.Controller.extend({

    queryParams: Object.keys(cfg.defaultQueryParams),
    queryParams: Object.keys(cfg.defaultQueryParams), // <--this works just fine, no need to manually specify

    init(){
    this._super(...arguments);
    this.setProperties(cfg.defaultQueryParams);
    this.setProperties(cfg.defaultQueryParams); // <--works for setting strings, but not arrays
    },

    filter2: [], // <--when added directly, arrays are added as 'Array[0]'

    actions: {
    addFilter: function(key, value) {
    alert(`adding ${key} ${value.toString()}`);
    console.log(this);
    alert(`adding "${value.toString()}" to controller property '${key}'`);
    console.log("DUMP OF EMBER 'this':", this);
    this[key].pushObject(value.toString());
    },
    removeFilter: function(key, value) {
    this[key].removeObject(value.toString());
    console.log(this[key]);
    },
    }
    }
    });
    7 changes: 0 additions & 7 deletions helpers.debug-filter.js
    Original file line number Diff line number Diff line change
    @@ -1,7 +0,0 @@
    import Ember from 'ember';

    export function debugFilter([value]) {
    return Ember.typeOf(value) !== 'function' && typeof value !== 'undefined' && value.length > 0;
    }

    export default Ember.Helper.helper(debugFilter);
    58 changes: 10 additions & 48 deletions routes.results.js
    Original file line number Diff line number Diff line change
    @@ -1,17 +1,12 @@
    import Ember from 'ember';

    // this would not be here, I'd import it to the route and the controller
    // this would not be here, I'd import it to both the route and the controller (perhaps from environment.js)
    const cfg = {
    defaultQueryParams: {
    q: null,
    paging: '18',
    search_sort: 'relevance',
    search_title: null,
    search_page: null,
    filter_breadcrumb: [],
    filter_price: [],
    filter_size_apparel: [],
    filter_color: []
    sort_method: 'relevance',
    filter1: [],
    filter2: []
    }
    };

    @@ -20,45 +15,12 @@ export default Ember.Route.extend({
    init() {
    this._super(...arguments);

    for (let qp of Object.keys(cfg.defaultQueryParams)) {
    //specify from cfg.defaultQueryParams rather than each one explicitly
    Object.keys(cfg.defaultQueryParams).forEach((qp) => {
    this.queryParams[qp] = { refreshModel: true };
    }
    },

    model(params) {

    let aggregations = {
    'aggregations': {
    'breadcrumb': [
    {
    'doc_count': 37,
    'key': 'Home'
    },
    {
    'doc_count': 15,
    'key': 'Home > Kitchen and Bar'
    },
    {
    'doc_count': 12,
    'key': 'Home > Footballz'
    },
    {
    'doc_count': 12,
    'key': 'Home > Garbage Cans'
    },
    {
    'doc_count': 16,
    'key': 'Brand new items'
    }
    ]
    }
    }
    return aggregations;
    });

    },

    setupController(controller, model) {
    controller.set('aggregations', model.aggregations);
    // setting each queryParams `refreshModel: true` using a loop does work! yay! See console:
    console.log("ROUTE queryParams:", this.queryParams);
    }

    });
    });
    2 changes: 1 addition & 1 deletion templates.application.hbs
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,7 @@
    <h1>Welcome to {{appName}}</h1>
    <br>
    <br>
    {{link-to "Click here (unless you already did)" "results" (query-params q="foo" paging="24" search_page="3" search_sort="relevance")}}
    {{link-to "Click here (unless you already did)" "results" (query-params q="foo")}}
    {{outlet}}
    <br>
    <br>
    29 changes: 7 additions & 22 deletions templates.results.hbs
    Original file line number Diff line number Diff line change
    @@ -1,29 +1,14 @@
    <h1>List of controller properties/query params:</h1>
    {{#each-in this as |key value|}}
    {{#if (debug-filter value)}}
    {{key}}: {{value}}<br>
    {{/if}}
    {{/each-in}}

    <br><br>
    <h1>List of selected filters:</h1>
    {{#each filter_breadcrumb as |bc|}}
    <a href="#" {{action "removeFilter" "filter_breadcrumb" bc}}>{{bc}}</a><br>
    {{/each}}

    <br><br>
    <h1>available filters (click to add to selected filters list above)</h1>
    <h1>Add a filter:</h1>
    <br>
    {{#each aggregations.breadcrumb as |breadcrumbs|}}
    <a href="#" {{action "addFilter" "filter_breadcrumb" breadcrumbs.key}}>{{breadcrumbs.key}} ({{breadcrumbs.doc_count}})</a><br>
    {{/each}}
    <a href="#" {{action "addFilter" "filter1" "Value of Filter 1"}}>Click to add a filter to filter1 array set in controller init()</a> (then see error in console and "DUMP OF EMBER 'this'" in console - note difference between default values of filter1 and filter2 arrays)
    <br><br>
    <a href="#" {{action "addFilter" "filter2" "Value of Filter 2"}}>Click to add a filter to filter2 array set right on the controller</a> (should work)
    <br><br>
    This runs action "addFilter" and throws an error : "Uncaught TypeError: Cannot read property 'pushObject' of undefined"<br>
    ( see image: http://imgur.com/SsUDToJ )<br>
    on this line in controller: this[key].pushObject(value.toString());<br>
    because the empty array assignment in cfg.defaultQueryParams did not get set via setProperties


    <h1>Selected filters (should be the result of clicking a link above):</h1>
    Filter1: {{#each filter1 as |bar|}}{{bar}}{{/each}}<br>
    Filter2: {{#each filter2 as |baz|}}{{baz}}{{/each}}<br>


    {{outlet}}
  3. tarponjargon created this gist Feb 11, 2017.
    5 changes: 5 additions & 0 deletions controllers.application.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    import Ember from 'ember';

    export default Ember.Controller.extend({
    appName: 'Ember Twiddle'
    });
    38 changes: 38 additions & 0 deletions controllers.results.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    import Ember from 'ember';

    // this would not be here, I'd import it to the route and the controller
    const cfg = {
    defaultQueryParams: {
    q: null,
    paging: '18',
    search_sort: 'relevance',
    search_title: null,
    search_page: null,
    filter_breadcrumb: [],
    filter_price: [],
    filter_size_apparel: [],
    filter_color: []
    }
    };

    export default Ember.Controller.extend({

    queryParams: Object.keys(cfg.defaultQueryParams),

    init(){
    this._super(...arguments);
    this.setProperties(cfg.defaultQueryParams);
    },

    actions: {
    addFilter: function(key, value) {
    alert(`adding ${key} ${value.toString()}`);
    console.log(this);
    this[key].pushObject(value.toString());
    },
    removeFilter: function(key, value) {
    this[key].removeObject(value.toString());
    console.log(this[key]);
    },
    }
    });
    7 changes: 7 additions & 0 deletions helpers.debug-filter.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    import Ember from 'ember';

    export function debugFilter([value]) {
    return Ember.typeOf(value) !== 'function' && typeof value !== 'undefined' && value.length > 0;
    }

    export default Ember.Helper.helper(debugFilter);
    13 changes: 13 additions & 0 deletions router.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,13 @@
    import Ember from 'ember';
    import config from './config/environment';

    const Router = Ember.Router.extend({
    location: 'none',
    rootURL: config.rootURL
    });

    Router.map(function() {
    this.route('results');
    });

    export default Router;
    64 changes: 64 additions & 0 deletions routes.results.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,64 @@
    import Ember from 'ember';

    // this would not be here, I'd import it to the route and the controller
    const cfg = {
    defaultQueryParams: {
    q: null,
    paging: '18',
    search_sort: 'relevance',
    search_title: null,
    search_page: null,
    filter_breadcrumb: [],
    filter_price: [],
    filter_size_apparel: [],
    filter_color: []
    }
    };

    export default Ember.Route.extend({
    queryParams: {},
    init() {
    this._super(...arguments);

    for (let qp of Object.keys(cfg.defaultQueryParams)) {
    this.queryParams[qp] = { refreshModel: true };
    }
    },

    model(params) {

    let aggregations = {
    'aggregations': {
    'breadcrumb': [
    {
    'doc_count': 37,
    'key': 'Home'
    },
    {
    'doc_count': 15,
    'key': 'Home > Kitchen and Bar'
    },
    {
    'doc_count': 12,
    'key': 'Home > Footballz'
    },
    {
    'doc_count': 12,
    'key': 'Home > Garbage Cans'
    },
    {
    'doc_count': 16,
    'key': 'Brand new items'
    }
    ]
    }
    }
    return aggregations;

    },

    setupController(controller, model) {
    controller.set('aggregations', model.aggregations);
    }

    });
    7 changes: 7 additions & 0 deletions templates.application.hbs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    <h1>Welcome to {{appName}}</h1>
    <br>
    <br>
    {{link-to "Click here (unless you already did)" "results" (query-params q="foo" paging="24" search_page="3" search_sort="relevance")}}
    {{outlet}}
    <br>
    <br>
    29 changes: 29 additions & 0 deletions templates.results.hbs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,29 @@
    <h1>List of controller properties/query params:</h1>
    {{#each-in this as |key value|}}
    {{#if (debug-filter value)}}
    {{key}}: {{value}}<br>
    {{/if}}
    {{/each-in}}

    <br><br>
    <h1>List of selected filters:</h1>
    {{#each filter_breadcrumb as |bc|}}
    <a href="#" {{action "removeFilter" "filter_breadcrumb" bc}}>{{bc}}</a><br>
    {{/each}}

    <br><br>
    <h1>available filters (click to add to selected filters list above)</h1>
    <br>
    {{#each aggregations.breadcrumb as |breadcrumbs|}}
    <a href="#" {{action "addFilter" "filter_breadcrumb" breadcrumbs.key}}>{{breadcrumbs.key}} ({{breadcrumbs.doc_count}})</a><br>
    {{/each}}
    <br><br>
    This runs action "addFilter" and throws an error : "Uncaught TypeError: Cannot read property 'pushObject' of undefined"<br>
    ( see image: http://imgur.com/SsUDToJ )<br>
    on this line in controller: this[key].pushObject(value.toString());<br>
    because the empty array assignment in cfg.defaultQueryParams did not get set via setProperties




    {{outlet}}
    18 changes: 18 additions & 0 deletions twiddle.json
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,18 @@
    {
    "version": "0.11.0",
    "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.10.2",
    "ember-data": "2.11.0",
    "ember-template-compiler": "2.10.2",
    "ember-testing": "2.10.2"
    },
    "addons": {}
    }