#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>