2015-10-10 2 views
0

Как можно обработать на модели ember, прежде чем возвращать ее в крючок? Я в настоящее время есть что-то по следующим направлениям в маршрутеEmberJS Обработка перед возвращением модели

model: function (params) { 
     var list_of_modelAs = []; 

     this.store.find('modelA').then(function (modelAs) { 
      modelAs.forEach (function (modelA) { 
       modelA.get('modelB').then(function(modelB) { 
        if (modelB.get('id') == params.modelB_id) { 
         list_of_modelAs.push(modelA) 
        } 
       }) 
      }) 
     }); 

     return list_of_modelAs; 
    } 

Где Modela и modelB конечно являются модели, определенной с Эмбер-Data.

Я по существу создаю массив моделей, но сначала их фильтрую. Действительно, я хочу просто фильтровать массив моделей, но я не мог понять, как это сделать, поскольку modelB является иностранной моделью (modelA принадлежит modelB, то есть каждая модель A имеет модель B). В идеале, что я пытаюсь сделать что-то вроде:

return this.store.find('modelA', where modelA.modelB.id = someValue)

Проблема заключается в том, конечно, что из-за обещания и такие, пустой list_of_modelAs возвращается только и модель приходит пустой.

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

+0

один вопрос, прежде чем я отправить ответ .. 'modelA.get' Ретур ns обещание, но 'modelB.get' не делает, это правильно? Или это зависит от аргумента, переданного для получения? –

+0

Я не уверен. Разве обе они не вернут обещание? – Aristides

+0

Не соответствует вашему коду –

ответ

1

возвращение обещание от модели крючка

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

model: function (params) { 
    return this.store.find('modelA') // important you do a return here, to return the promise 
    .then(function (modelAs) { // modelAs is an array of modelA - we can use map to change this to an array of modelA.get('modelB') promises 
     return Promise.all(modelAs.map(function (modelA) { // Promise.all resolves when the array of promises resolves, it resolves to an array of results 
      return modelA.get('modelB').then(function (modelB) { // just do the asynch stuff here, return modelA if the id is OK, otherwise return null which will be filtered out later 
       if (modelB.get('id') == params.modelB_id) { 
        return modelA; 
       } 
       else { 
        return null; 
       } 
      }); 
     })); 
    }) 
    .then(
     function(data) { // data is an array of values returned from Promise.all - filter out the null values as they are the ones that don't have the correct ModelB id 
      return data.filter(function(datum) { 
       return datum !== null; 
      }); 
     } 
    ); 
    // the final return value will be a promise of an array of ModelA whose ModelB has the required `id` 
} 

вызывается с помощью

???.model(params) 
.then(function(modelAs) { 
    // NOTE: modelAs is an array of modelA's not promises 
}); 
+0

Он работает, спасибо! Просто чтобы убедиться, что я понял, что вы сделали: таким образом, вы сделали оригинальный store.find, который возвращает обещание, затем вы вызываете 'then' на нем, который указывает функцию, выполняемую, когда обещание заполняется дважды, а затем функционировать? то для меня все становится немного мутным. – Aristides

+0

Позвольте мне добавить несколько комментариев: D –

+0

дайте мне знать, если у вас есть дополнительные вопросы –

Смежные вопросы