2017-06-14 58 views
0

我試圖實現一個搜索功能,用戶可以通過傳遞用戶名通過組件返回其他用戶。我跟着灰燼指南和有下面的代碼在我的路線文件,這樣做的:使用字符串在餘燼中返回記錄

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    flashMessages: Ember.inject.service(), 
    actions: { 
    searchAccount (params) { 
     // let accounts = this.get('store').peekAll('account'); 
     // let account = accounts.filterBy('user_name', params.userName); 
     // console.log(account); 

     this.get('store').peekAll('account') 
     .then((accounts) => { 
     return accounts.filterBy('user_name', params.userName); 
     }) 
     .then((account) => { 
     console.log(account); 
     this.get('flashMessages') 
     .success('account retrieved'); 
     }) 
     .catch(() => { 
     this.get('flashMessages') 
     .danger('There was a problem. Please try again.'); 
     }); 
    } 
    } 
}); 

此代碼,然而,拋出我下面的錯誤:

"You cannot pass '[object Object]' as id to the store's find method"

我認爲這實施.find方法不再有效,我需要以不同的方式返回對象。我會如何去做這件事?

+1

你說你遵循了餘燼指南,但它在哪裏提及使用find方法。 'find'是一種私人方法,所以不要使用它。 – kumkanillam

回答

1

您不能爲filterBy.then

您不能爲peekAll.then。因爲兩者都不會回覆諾言。

調用異步代碼並在searchAccount內部返回結果在這裏沒有多大意義。因爲searchAccount將在完成異步代碼之前快速返回。

this.get('store').findAll('account',{reload:true}).then((accounts) =>{ 
if(accounts.findBy('user_name', params.userName)){ 
    // show exists message 
} else { 
    //show does not exist message 
} 
}); 

上面的代碼將聯繫服務器,並獲得所有的結果,然後做findBy過濾。所以過濾在客戶端完成。代替這個,你可以做查詢,

this.store.query('account', { filter: { user_name: params.userName } }).then(accounts =>{ 
//you can check with length accounts.length>0 
//or you accounts.get('firstObject').get('user_name') === params.userName 
//show success message appropriately. 
}); 
+1

您的第一個實施結束了我的工作,讓我拉我正在查找的帳戶,並查詢其屬性。非常感謝你! – d00medman

1

DS.Store#find在Ember Data的現代版本中不是有效的方法。如果用戶已經在店裏,你可以窺視它們進行過濾:

this.store.peekAll('account').filterBy('user_name', params.userName); 

否則,您必須使用您在前面的問題中使用同樣的方法,並query他們(假設你的後端支持篩選):

this.store.query('account', { filter: { user_name: params.userName } }); 
+0

我試着實現這個代碼,但它一直打破並拋出一個錯誤,讀取TypeError:this.get(...)。peekAll(...)。然後它不是Class.searchAccount函數。我可以將它們分開,但運行filterBy無法捕獲任何數據。您認爲造成這些錯誤的是什麼,我該如何解決這些錯誤? – d00medman

+0

@ d00medman啊,那麼,'peekAll'不會回覆承諾。我會修復我的示例解決方案。 – mwp