2015-04-28 2 views
4

Я следовал руководству Query Params (http://guides.emberjs.com/v1.11.0/routing/query-params/), и он отлично поработал. В частности, обновление модели сделало именно то, что я хотел.EmberJS: объект в качестве параметра запроса для обновления модели

Я перемещаю фильтр в спецификацию json-api, и фильтрация происходит в объекте filter. Таким образом, вместо:

http://localhost:3000/accounts?id=1 

Сервер отвечает:

http://localhost:3000/accounts?filter[id]=1 

Я пытался получить параметры запроса работать обновив модель, основанную на объекте, но это, кажется, не обновлять.

// app/controllers/accounts/index.js 

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    queryParams: ['filter', 'sort'], 

    filter: {}, 
    sort: '-id' 
}); 


// app/routes/accounts/index.js 
import Ember from 'ember'; 

export default Ember.Route.extend({ 
    queryParams: { 
    filter: { refreshModel: true }, 
    sort: { refreshModel: true } 
    }, 
    model: function(params) { 
    return this.store.find('account', params); 
    }, 
}); 

// template 
<th>{{input type="text" placeholder="ID" value=filter.id}}</th> 

Возможно ли, что параметры запроса работают с объектом?

ответ

4

Этот ответ относится к версии Ember 1.13.0-beta.1+canary.

Короткий ответ: Нет. Параметр запроса не будет работать с объектом.

Длинный ответ:

В настоящее время, частная функция с именем _serializeQueryParams в Router Сериализует queryParams.

_serializeQueryParams(targetRouteName, queryParams) { 
    var groupedByUrlKey = {}; 

    forEachQueryParam(this, targetRouteName, queryParams, function(key, value, qp) { 
    var urlKey = qp.urlKey; 
    if (!groupedByUrlKey[urlKey]) { 
     groupedByUrlKey[urlKey] = []; 
    } 
    groupedByUrlKey[urlKey].push({ 
     qp: qp, 
     value: value 
    }); 
    delete queryParams[key]; 
    }); 

    for (var key in groupedByUrlKey) { 
    var qps = groupedByUrlKey[key]; 
    var qp = qps[0].qp; 
    queryParams[qp.urlKey] = qp.route.serializeQueryParam(qps[0].value, qp.urlKey, qp.type); 
    } 
}, 

qp.urlKey будет вычисляться 'filter' в вашем примере, и объект будет сериализовать 'object [Object]'. Даже если вы могли бы переопределить метод serializeQueryParam в вашем маршруте, это не помогло бы, потому что ключ queryParam все равно будет 'filter', и вам нужно, чтобы это было 'filter%5Bid%5D'

на основе this comment in the Ember Discussion Forum, это звучит как Params объекта запроса являются маловероятно, и вам было бы лучше просто сгладить и открутить отфильтрованные поля.

1

Я знаю, что это немного поздно, но вы можете использовать это обходное решение, чтобы разрешить объекты с параметрами запроса. Довольно легко работать, и до сих пор у меня не было никаких проблем.

Я столкнулся с той же проблемой при создании приложения Ember поверх моего JSON API (http://jsonapi.org/).

Спецификация API JSON обеспечивает рекомендуемый синтаксис как для поискового вызова, так и для фильтрации, для которого требуются параметры запроса на основе объекта.

Для подкачки это предполагает синтаксис вроде этого:

/books?page[size]=100&page[number]=1 

и для фильтрации его предложить синтаксис вроде этого:

/books?filter[author]=Bob 

В то время как ember.js Запрос Params (как Эмбер v2.1) делают не поддерживайте это из коробки, довольно просто работать. В вашем контроллере вы должны сопоставить свойство контроллера с параметром «объект» запроса как строку.

Так, например, в приведенном выше примере «фильтр» вы должны сопоставить свойство контроллера с именем filterByAuthorValue с параметром запроса filter[author].

код, чтобы сделать это будет выглядеть следующим образом:

export default Ember.Controller.extend({ 
    queryParams: ['sort',{ 
    filterByAuthorValue: 'filter[author]' 
    }], 
    sort: '', 
    filterByAuthorValue: '' 
}); 

Примечание В приведенном выше примере я также есть запрос называется парам рода (который также соответствует рекомендациям API JSON, но не требует объекта). Для получения дополнительной информации о отображении свойства контроллера к парам запроса см этого раздел официального руководства ember.js:

http://guides.emberjs.com/v2.1.0/routing/query-params/#toc_map-a-controller-s-property-to-a-different-query-param-key

После того, как у вас есть запрос, созданные пары затем нужно обработать запрос param в вашем маршрутизаторе. Во-первых, маршрутизатор должен заставить модель должна быть обновлена, когда контроллер собственности filterByAuthor изменения:

export default Ember.Route.extend({ 
    queryParams: { 
    sort: { 
     refreshModel: true 
    }, 
    filterByAuthor:{ 
     refreshModel: true 
    } 
    } 
}); 

Наконец, теперь нужно перевести свойство контроллера filterByAuthor в реальный объект при загрузке модели в model метод маршрутизатора и присвоить значение из свойства контроллера filterByAuthor. Полный код маршрутизатора будет выглядеть как:

export default Ember.Route.extend({ 
    queryParams: { 
    sort: { 
     refreshModel: true 
    }, 
    filterByAuthor:{ 
     refreshModel: true 
    } 
    }, 
    model: function(params){ 
    // The params value for filtering the entity name 
    if(params.filterByAuthor){ 
     params.filter = {}; 
     params.filter['author'] = params.filterByAuthor; 
     delete params.filterByAuthor; 
    } 
    return this.store.query('book', params); 
    }, 
}); 

настройки вещи, как это позволяет для объекта на основе запроса парам, которые будут использоваться с Эмбер и, таким образом, следовать рекомендациям JSON API.

Выше был протестирован со следующими версиями:

Ember    : 2.1.0 
Ember Data  : 2.1.0 
jQuery   : 1.11.3 
Смежные вопросы