Ember.js функция find() не работает с параметрами

#javascript #ember.js #find #ember-data

#javascript #ember.js #Найти #ember-данные

Вопрос:

Я пытаюсь использовать простое приложение для поиска сообщений с помощью ember. Все работает нормально, пока я не передаю аргументы функции find():

Это отлично работает:

 return this.store.find('post')
  

Но не эти:

 return this.store.find('post', { title: 'title1' })

return this.store.find('post', {})
  

Сервер возвращает точно такой же JSON независимо от параметров, но Ember, похоже, не обрабатывает его при наличии аргументов. Хранилище остается пустым.

Вот полный код:

 App = Ember.Application.create({
    LOG_TRANSITIONS: true
});

App.Router.map(function(){
    this.resource('myPosts');
});

App.ApplicationAdapter = DS.RESTAdapter.extend({
    namespace: 'api/v1/'
});

App.Post = DS.Model.extend({
    title : DS.attr( 'string' ),
    body : DS.attr( 'string' )
});

App.MyPostsRoute = Ember.Route.extend({
    model : function() {
        return this.store.find('post', { title: 'title1' })
    },

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

Во всех случаях я никогда не получаю никаких ошибок, запросы обрабатываются просто отлично, и я проверил в chrome DevTools, что JSON, возвращаемый сервером, совпадает.

Вот возвращенный JSON.

 {"post": [{"body": "a body", "title": "title1"}]}
  

Шаблон handelbars просто:

 <script type="text/x-handlebars" id="myPosts">
    <div class = "postsWrapper">
        {{#each}}
            <div>{{this}}</div>
            <div>title: {{title}}</div>
        {{/each}}
    </div>
</script>
  

Вот результат, который я получаю с помощью this.store.find(‘post’, { title: ‘title1’ }):

 <App.Post:ember382:null>
title:
  

Вот тот, который я получаю без параметров:

 <App.Post:ember294:null>
title: title1
  

Спасибо за помощь.

Ответ №1:

Хорошо, после дальнейшего обсуждения я думаю, что ваша проблема связана с API.

При вызове this.store.find('post') Ember следует сделать GET запрос к api/v1/posts конечной точке, который должен вернуть следующий JSON:

Примечание: это множественный объект posts с массивом объектов post.

 {
    "posts": [
        { "body": "body1", "title": "title1" },
        { "body": "body2", "title": "title2" }
    ]
}
  

При вызове this.store.find('post', { title: 'title1' }) Ember следует сделать GET запрос к api/v1/posts?title=title1 конечной точке, которая должна вернуть этот JSON:

Примечание: это отдельный объект post с одним объектом post.

 {
    "post": { "body": "body1", "title": "title1" }
}
  

Формат, в котором JSON возвращается с сервера, действительно важен, API должен выполнять фильтрацию, Ember не фильтрует, если вы не попросите его об этом.

Комментарии:

1. Это тоже не работает. Это становится действительно неприятным, я попробовал несколько вещей, и в конце концов я упростил все, чтобы модель имела только заголовок и тело, но это не имело никакого значения. Я обновил исходный вопрос новой моделью и добавил дополнительную информацию. Спасибо за вашу помощь.

2. На мой взгляд, это похоже на какую-то проблему гонки, когда шаблон отображается до полной обработки запроса.

3. Это действительно странно. Насколько я понимаю, Ember будет отображать шаблон только с тем, что обещание запроса выполнено, поэтому не должно быть никакой проблемы «гонки, чтобы добраться туда первым». Возвращаемый JSON — это то же самое, когда у вас есть запрос, и когда у вас его нет?

4. Кроме того, возможно, вы уже знаете, но стоит сказать, что Ember отправит запрос XHR с параметром GET при использовании find . Например api/v1/posts?title=title1 , настроен ли ваш API для обработки подобных параметров?

5. Да, это так, на самом деле он всегда возвращает один и тот же JSON, независимо от того, каковы параметры.