#7 处理元数据

英文原版:https://guides.emberjs.com/v2.14.0/models/handling-metadata/

伴随着store收到远程返回的记录,你有可能会需要处理元数据–metadata。 Metadata 是与某种模型或类型有关的数据,并非与记录有关。

分页是一个展示如何使用metadata的常见例子。假设博客包含的帖子太多,一次展示不完。那么你可能会想这么分阶段的获得不同的帖子:

let result = this.get('store').query('post', {
  limit: 10,
  offset: 0
});

通过改变offset的值,你就可以获得属于不同页码的帖子。这样挺不错!但是,你如何才能知道总共有多少页的数据?你的服务端需要将帖子的总数返回来,这个帖子的总数就是我们所指的metadata。

每个序列化器都希望以不同的方式返回元数据。例子,Ember Data的JSON反序列化器会寻找以meta为key的对象:

{
  "post": {
    "id": 1,
    "title": "Progressive Enhancement is Dead",
    "comments": ["1", "2"],
    "links": {
      "user": "/people/tomdale"
    },
    // ...
  },

  "meta": {
    "total": 100
  }
}

无论用的是哪种序列化器, metadata都是从响应用提取的。随后,你就可以通过.get(‘meta’)方法来获得metadata的值。

你可以在store.query()方法之后来使用它:

store.query('post').then((result) => {
  let meta = result.get('meta');
})

对于belongsTo关联关系:

let post = store.peekRecord('post', 1);

post.get('author').then((author) => {
  let meta = author.get('meta');
});

或者对于hasMany关联关系:

let post = store.peekRecord('post', 1);

post.get('comments').then((comments) => {
  let meta = comments.get('meta');
});

在读取meta之后,meta.total就可以用来计算你会有多少页的帖子了。

要在model()钩子函数之外使用meta,你需要返回它:

app/routes/users.js

import Ember from 'ember';

export default Ember.Route.extend({
  model() {
    return this.store.findAll('user').then((results) => {
      return {
        users: results,
        meta: results.get('meta')
      };
    });
  },

  setupController(controller, { users, meta }) {
    this._super(controller, users);
    controller.set('meta', meta);
  }
});

若需要自定去提取metadata的方式,请查阅文档中关于serializer–序列化器的描述。

本节完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值