Ember 記錄查詢

2018-01-06 18:00 更新

store提供了統(tǒng)一的獲取數(shù)據(jù)的接口。包括創(chuàng)建新記錄、修改記錄、刪除記錄等,更多有關(guān)Store API請(qǐng)點(diǎn)擊網(wǎng)址看詳細(xì)信息。

為了演示這些方法的使用我們結(jié)合firebase,關(guān)于firebase與Ember的整合前面的文章已經(jīng)介紹,就不過多介紹了。 做好準(zhǔn)備工作:

  1. ember g route articles
  2. ember g route articles/article

1,查詢方法findAll,findRecord,peekAll,peekRecord

首先配置route,修改子路由增加一個(gè)動(dòng)態(tài)段article_id,有關(guān)動(dòng)態(tài)的介紹請(qǐng)看Dynamic Segments。

  1. // app/router.js
  2. // 其他代碼略寫,
  3. Router.map(function() {
  4. this.route('store-example');
  5. this.route('articles', function() {
  6. this.route('article', { path: '/:article_id' });
  7. });
  8. });

下面是路由代碼,這段代碼直接調(diào)用Store的find方法,返回所有數(shù)據(jù)。

  1. // app/routes/articles.js
  2. import Ember from 'ember';
  3. export default Ember.Route.extend({
  4. model: function() {
  5. // 返回firebase數(shù)據(jù)庫(kù)中的所有article
  6. return this.store.findAll('article');
  7. }
  8. });

為了界面看起來(lái)舒服點(diǎn)我引入了bootstrap框架。引入的方式:bower install bootstrap安裝插件。然后修改ember-cli-build.js,在return之前引入bootstrap:

  1. app.import("bower_components/bootstrap/dist/js/bootstrap.js");
  2. app.import("bower_components/bootstrap/dist/css/bootstrap.css");

重啟項(xiàng)目使其生效。

下面是顯示數(shù)據(jù)的模板articles.hbs

  1. <div class="container">
  2. <div class="row">
  3. <div class="col-md-4 col-xs-4">
  4. <ul class="list-group">
  5. {{#each model as |item|}}
  6. <li class="list-group-item">
  7. {{#link-to 'articles.article' item.id}}
  8. {{item.title}}
  9. {{/link-to}}
  10. </li>
  11. {{/each}}
  12. </ul>
  13. </div>
  14. <div class="col-md-8 col-xs-8">
  15. {{outlet}}
  16. </div>
  17. </div>
  18. </div>

在瀏覽器運(yùn)行:http://localhost:4200/articles/。稍等就可以看到顯示的數(shù)據(jù)了,等待時(shí)間與你的網(wǎng)速有關(guān)。畢竟firebase不是在國(guó)內(nèi)的!?。∪绻绦虼a沒有寫錯(cuò)那么你會(huì)看到如下圖的結(jié)果:

articles數(shù)據(jù)列表

但是右側(cè)是空白的,下面點(diǎn)擊任何一條數(shù)據(jù),可以看到右側(cè)什么都不顯示! 下面在子模板中增加顯示數(shù)據(jù)的代碼:

  1. <h2>{{model.title}}</h2>
  2. <div class = "body">
  3. {{model.body}}
  4. </div>

在點(diǎn)擊左側(cè)的數(shù)據(jù),右側(cè)可以顯示對(duì)應(yīng)的數(shù)據(jù)了!但是這個(gè)怎么就顯示出來(lái)了呢??其實(shí)Ember自動(dòng)根據(jù)動(dòng)態(tài)段過濾了,當(dāng)然你也可以顯示使用findRecord方法過濾。

  1. // app/routes/articles/article.js
  2. import Ember from 'ember';
  3. export default Ember.Route.extend({
  4. model: function(params) {
  5. console.log('params = ' + params.article_id);
  6. // 'chendequanroob@gmail.com'
  7. return this.store.findRecord('article', params.article_id);
  8. }
  9. });

此時(shí)得到的結(jié)果與不調(diào)用findRecord方法是一致的。為了驗(yàn)證是不是執(zhí)行了這個(gè)方法,我們把動(dòng)態(tài)段params.article_id的值改成一個(gè)不存在的值’ ubuntuvim’,可以確保的是在我的firebase數(shù)據(jù)中不存在id為這個(gè)值的數(shù)據(jù)。此時(shí)控制臺(tái)會(huì)出現(xiàn)下面的錯(cuò)誤信息,從錯(cuò)誤信息可以看出來(lái)是因?yàn)橛涗洸淮嬖诘脑颉?/p>

數(shù)據(jù)不存在錯(cuò)誤

在上述的例子中,我們使用了findAll()方法和findRecord()方法,還有兩個(gè)方法與這兩個(gè)方法是類似的,分別是peekRecord()peekAll()方法。這兩個(gè)方法的不同之處是不會(huì)發(fā)送請(qǐng)求,他們只會(huì)在本地緩存中獲取數(shù)據(jù)。

下面分別修改articles.jsarticle.js這兩個(gè)路由。使用peekRecord()peekAll()方法測(cè)試效果。

  1. // app/routes/articles.js
  2. import Ember from 'ember';
  3. export default Ember.Route.extend({
  4. model: function() {
  5. // 返回firebase數(shù)據(jù)庫(kù)中的所有article
  6. // return this.store.findAll('article');
  7. return this.store.peekAll('article');
  8. }
  9. });

由于沒有發(fā)送請(qǐng)求,我也沒有把數(shù)據(jù)存儲(chǔ)到本地,所以這個(gè)調(diào)用什么數(shù)據(jù)都沒有。

  1. // app/routes/articles/article.js
  2. import Ember from 'ember';
  3. export default Ember.Route.extend({
  4. model: function(params) {
  5. // return this.store.findRecord('article', params.article_id);
  6. return this.store.peekRecord('article', params.article_id);
  7. }
  8. });

由于在父路由中調(diào)用findAll獲取到數(shù)據(jù)并已經(jīng)存儲(chǔ)到Store中,所以可以用peekRecord()方法獲取到數(shù)據(jù)。 但是在模型簡(jiǎn)介這篇文章介紹過Store的特性,當(dāng)界面獲取數(shù)據(jù)的時(shí)候首先會(huì)在Store中查詢數(shù)據(jù)是否存在,如果不存在在再發(fā)送請(qǐng)求獲取,所以感覺peekRecord()findRecord()方法區(qū)別不是很大!

2,查詢多記錄方法query()

項(xiàng)目中經(jīng)常會(huì)遇到根據(jù)某個(gè)值查詢出一組匹配的數(shù)據(jù)。此時(shí)返回的數(shù)據(jù)就不是只有一條了,那么Ember有是怎么去實(shí)現(xiàn)的呢?

  1. // app/routes/articles.js
  2. import Ember from 'ember';
  3. export default Ember.Route.extend({
  4. model: function() {
  5. // 返回firebase數(shù)據(jù)庫(kù)中的所有article
  6. // return this.store.findAll('article');
  7. // return this.store.peekAll('article');
  8. // 使用query方法查詢category為Java的數(shù)據(jù)
  9. return this.store.query('article', { filter: { category: 'java' } }).then(function(item) {
  10. // 對(duì)匹配的數(shù)據(jù)做處理
  11. return item;
  12. });
  13. }
  14. });

查詢categoryJava的數(shù)據(jù)。如果你只想精確查詢到某一條數(shù)據(jù)可以使用queryRecord()方法。如下:

  1. this.store.queryRecord('article', { filter: { id: ' -JzyT-VLEWdF6zY3CefO' } }).then(function(item) {
  2. // 對(duì)匹配的數(shù)據(jù)做處理
  3. });

到此,常用的方法介紹完畢,希望通過介紹上述幾個(gè)方法起到拋磚引玉的效果,有關(guān)于DS.Store類的還有很多很多的方法,使用方式都是類似的,更多方法請(qǐng)自己看API文檔學(xué)習(xí)。

博文完整代碼放在Github(博文經(jīng)過多次修改,博文上的代碼與github代碼可能有出入,不過影響不大?。?,如果你覺得博文對(duì)你有點(diǎn)用,請(qǐng)?jiān)趃ithub項(xiàng)目上給我點(diǎn)個(gè)star吧。您的肯定對(duì)我來(lái)說(shuō)是最大的動(dòng)力!!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)