英文原版: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–序列化器的描述。
本节完