Ember.js : Как запрашивать записи, используя несколько аргументов?

#ember.js #ember-data

#ember.js #ember-data

Вопрос:

У меня есть дневные записи, которые содержат записи задач через hasmany-relationship.

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

 App.DayIndexController = Ember.ObjectController.extend({
    ...
   results: function(){

        var date = this.get('model.id');

        return ...

    }.property(),
    ....
});
  

Что я пробовал среди прочих:

Когда я запрашиваю с помощью 1 параметра, он возвращает правильные записи.

 // returns completed tasks
return this.store.find('task', {isCompleted: true}); 
  

Когда я запрашиваю с помощью 2 параметров, второй игнорируется.

 // returns ONLY completed
return this.store.find('task', {isCompleted: true, dayName: date})  tasks
  

Возвращает объект, но мне нужен массив для перебора:

 return this.store.find('task', {dayName: date}).then(function(tasks){
    return tasks.filterBy('isCompleted', true);
});
  

Также возвращает объект:

 return this.store.find('task', {dayName: date}).then(function(tasks){
    return tasks.find('task', {isCompleted: true});
});
  

Модель:

 App.Task = DS.Model.extend({
    dayName: DS.attr('string'),
    title: DS.attr('string'),
    isCompleted: DS.attr('boolean'),
    quarters: DS.hasMany('quarter', {async: true})
});
  

Я использую Ember Data 1.0.0-beta с LSAdapter.

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

1. Можем ли мы ознакомиться с App.Task моделью и настройками вашего адаптера? Возможно, это не работает, потому что ваш API не работает таким образом, т.Е. this.store.find('task', {isCompleted: true, dayName: date}) отправил бы запрос, подобный http://apiurl.com/task?isCompletedamp;dayName=somedate . Если вашему API требуется другой вызов, вам необходимо переопределить findQuery метод при указании адаптера для вашей модели.

Ответ №1:

это может выглядеть как объект, но на самом деле это коллекция. Затем вы можете выполнить итерацию с помощью forEach или простого цикла for objectAt .

 this.store.find('task', {dayName: date}).then(function(tasks){
  tasks.forEach(function(task){
    console.log(task.get('name'));
  });
});


this.store.find('task', {dayName: date}).then(function(tasks){
  for(var i =0,len=tasks.get('length');i<len;i  ){
     var task = tasks.objectAt(i);
  }
});
  

Что касается того, что он игнорирует несколько элементов запроса, он запрограммирован на обработку нескольких элементов запроса, но работает это или нет, я не уверен. Запустите отладчик здесь: https://github.com/rpflorence/ember-localstorage-adapter/blob/master/localstorage_adapter.js#L188

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

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

Ответ №2:

Спасибо вам всем за помощь! Я, наконец, получил это, работая с вычисляемым свойством.

 App.DayIndexController = Ember.ObjectController.extend({

    items: function() {
        return this.get('model.tasks');
    }.property(),

    actions: {
        filterCompleted: function(){
            var tasks = this.get('model.tasks').filterBy('isCompleted');
            this.set('items', tasks);
        },

        filterAll: function(){
            this.set('items', this.get('model.tasks'));
        },

        filterActive: function(){
            var tasks = this.get('model.tasks').rejectBy('isCompleted', true);
            this.set('items', tasks);
        }
    }
});
  

Шаблон:

 {{#each task in items}}
    {{task.title}}
{{/each}}

<button {{action "filterAll"}}>All</button>
<button {{action "filterCompleted"}}>Completed</button>
<button {{action "filterActive"}}>Active</button>