Ember route with dynamic filter / search criterias

后端 未结 3 2134
礼貌的吻别
礼貌的吻别 2020-12-30 17:33

With the following problem I got stuck now for days. My use case is that I have a database with millions of addresses. From an web-application I would like to search them, d

3条回答
  •  北海茫月
    2020-12-30 18:22

    Based on the answer from intuitivepixel I came up with the following solution.

    I construct the following URL: http://somedomain.com/#/searchresults/?lastname=king&firstname=stephen&city=somecity

    The way how this URL is contructed is not described here. In my case I use a my own view with a form and some event handlers.

    The code that I got working looks like this:

    App.Router.map(function() {
        this.resource("searchresults", { path: '/searchresults/:dynamic' });
    });
    
    App.SearchresultsRoute = Ember.Route.extend((function() {
        var deserializeQueryString = function (queryString) {
            if(queryString.charAt(0) === "?")
                queryString = queryString.substr(1);
    
            var vars = queryString.split('&'),
                i = 0, length = vars.length,
                outputObj = {};
    
            for (; i < length; i++) {
                var pair = vars[i].split('=');
                outputObj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
            }
            return outputObj;
        };
    
        return {
              model: function(param) {
                var paramObj = deserializeQueryString(param.dynamic);
                return App.Searchresult.find(paramObj);
              }
            };
        })()
    );
    
    App.Store = DS.Store.extend({
        revision: 12,
        adapter: DS.RESTAdapter.create({
            namespace: 'api'
        })
    });
    
    App.Searchresult = DS.Model.extend({
        lastname: DS.attr('string'),
        firstname: DS.attr('string'),
        street: DS.attr('string'),
        hno: DS.attr('string'),
        zip: DS.attr('string'),
        city: DS.attr('string'),
        country: DS.attr('string'),
        birthdate: DS.attr('string')
    });
    

    This generates an HTTP GET request to my REST API:

    http://somedomain.com/api/searchresults?lastname=king&firstname=stephen&city=somecity
    

    My REST API responds with:

    {"searchresults":
        [{"id":"2367507","lastname":"King","firstname":"Stephen","street":"Mainstreet.","hno":"21" ...},
         {"id":"3222409","lastname":"King","firstname":"Stephen","street":"Broadway","hno":"35" ...}
        ]}
    

    And this then gets visualized with this template:

    Searchresults

    {{#each item in controller}} {{/each}}
    Name Street / Hno City Birthyear
    {{item.firstname}} {{item.lastname}} {{item.street}} {{item.hno}} {{item.zip}} {{item.city}} {{item.birthdate}}

    If somebody finds a more elegant way, that does not require to use a custom deserializer, I will be glad to update the solution. The answer provided by (the other) Daniel that suggests http://somedomain.com/#/searchresults/king/stephen/somecity is not parctial for my case, since in the solution that I need, I have more than 10 different search criterias / filters. Users usually only choose to fill a few of them.

    This examples base on ember-data revision: 12 and Ember 1.0.0-RC.3

提交回复
热议问题