将查询响应分配给模型字段时丢失大量 ember-data class 属性
Losing tons of ember-data class attributes when assigning query response to model field
在我的 EmberJS 应用程序中,我有两个模型,Book 和 Page。 Book 与 Page 有 hasMany 关系。在我的控制器中编辑一本书,我正在查询以获取与该书相关的所有页面,然后将查询的响应分配回书的页面字段。
我正在使用第三方 EmberJS 库 ember-models-table 制作分页 table。我将 book.pages 传递给分页的 table 组件,一切正常,除非我想在结果页面之间实际移动。我正在使用的 ember-models-table 版本期望 book.pages 上的某些字段在分页结果时出现:meta、查询、存储和type.modelName。我可以明确地将这些字段设置为 book.pages,但我觉得必须有更好的方法。当您将该响应设置到另一个对象时,为什么 EmberJS 会从 ember 数据查询响应中删除 meta 和 store 等字段?
控制器
this.get('store').query('page', { bookId }).then((res) => {
set(book, 'pages', res);
// Third Party Paginated Table Component Requires These Fields
set(book, 'pages.meta', res.get('meta'));
set(book, 'pages.query', res.get('query'));
set(book, 'pages.store', res.get('store'));
set(book, 'pages.type.modelName', res.get('type.modelName'));
});
HBS - 页数 table
{{models-table-paginated
data=book.pages
columns=columns
customClasses=(hash table='table table-condensed')
showGlobalFilter=false
showColumnsDropdown=false
selectRowOnClick=false
pageSize=10
}}
您也需要编辑序列化程序。例如,我也使用 models-table 但在后端,我使用 Django 适配器。因此,我必须为每个模型编辑序列化程序以计算剩余页数 (totalPages) 并形成该数字以根据您的 pageSize 进行分页。同样在查询您的路线时,您需要将 pageSize 和 page 设置为默认值。现在,如果你不像 Django 那样使用 meta,你应该检查你的适配器文档
例如,在 Django 中,书籍模型的序列化程序将是这样的
import DRFSerializer from './drf';
import DS from 'ember-data';
import { isNone } from '@ember/utils';
export default DRFSerializer.extend(DS.EmbeddedRecordsMixin,{
extractMeta: function(store, type, payload) {
let meta = this._super(store, type, payload);
if (!isNone(meta)) {
// Add totalPages to metadata.
let totalPages = 1;
if (!isNone(meta.next)) {
// Any page that is not the last page.
totalPages = Math.ceil(meta.count / payload[type.modelName].length);
} else if (isNone(meta.next) && !isNone(meta.previous)) {
// The last page when there is more than one page.
totalPages = meta.previous + 1;
}
meta['totalPages'] = totalPages;
}
return meta;
}
在我的 EmberJS 应用程序中,我有两个模型,Book 和 Page。 Book 与 Page 有 hasMany 关系。在我的控制器中编辑一本书,我正在查询以获取与该书相关的所有页面,然后将查询的响应分配回书的页面字段。
我正在使用第三方 EmberJS 库 ember-models-table 制作分页 table。我将 book.pages 传递给分页的 table 组件,一切正常,除非我想在结果页面之间实际移动。我正在使用的 ember-models-table 版本期望 book.pages 上的某些字段在分页结果时出现:meta、查询、存储和type.modelName。我可以明确地将这些字段设置为 book.pages,但我觉得必须有更好的方法。当您将该响应设置到另一个对象时,为什么 EmberJS 会从 ember 数据查询响应中删除 meta 和 store 等字段?
控制器
this.get('store').query('page', { bookId }).then((res) => {
set(book, 'pages', res);
// Third Party Paginated Table Component Requires These Fields
set(book, 'pages.meta', res.get('meta'));
set(book, 'pages.query', res.get('query'));
set(book, 'pages.store', res.get('store'));
set(book, 'pages.type.modelName', res.get('type.modelName'));
});
HBS - 页数 table
{{models-table-paginated
data=book.pages
columns=columns
customClasses=(hash table='table table-condensed')
showGlobalFilter=false
showColumnsDropdown=false
selectRowOnClick=false
pageSize=10
}}
您也需要编辑序列化程序。例如,我也使用 models-table 但在后端,我使用 Django 适配器。因此,我必须为每个模型编辑序列化程序以计算剩余页数 (totalPages) 并形成该数字以根据您的 pageSize 进行分页。同样在查询您的路线时,您需要将 pageSize 和 page 设置为默认值。现在,如果你不像 Django 那样使用 meta,你应该检查你的适配器文档
例如,在 Django 中,书籍模型的序列化程序将是这样的
import DRFSerializer from './drf';
import DS from 'ember-data';
import { isNone } from '@ember/utils';
export default DRFSerializer.extend(DS.EmbeddedRecordsMixin,{
extractMeta: function(store, type, payload) {
let meta = this._super(store, type, payload);
if (!isNone(meta)) {
// Add totalPages to metadata.
let totalPages = 1;
if (!isNone(meta.next)) {
// Any page that is not the last page.
totalPages = Math.ceil(meta.count / payload[type.modelName].length);
} else if (isNone(meta.next) && !isNone(meta.previous)) {
// The last page when there is more than one page.
totalPages = meta.previous + 1;
}
meta['totalPages'] = totalPages;
}
return meta;
}