- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用@ngrx/data 时遇到了一些困难,希望你们中的一位天才可以帮助我。
我有一个实体集合,想存储一些额外的信息以减少到服务器的往返次数并减少冗余加载。我有一个数据表,一次只想将一页加载到实体集合中,为了能够做到这一点,我想向我的集合中添加额外的元数据,以便我知道何时加载更多数据。例如。当我到达加载数据的末尾时加载更多(分页需要知道存在多少记录以及已加载多少记录)。
根据documentation我可以添加 additionalCollectionState 但需要一些更新新状态属性的方法。
我想我会复制/粘贴他们作为基础的示例代码并修改它以反射(reflect)我自己的属性。问题是我立即在 =>Action
Generic type 'Action' requires 1 type argument(s)
export class AdditionalPersistenceResultHandler extends DefaultPersistenceResultHandler {
handleSuccess(originalAction: EntityAction): (data: any) => Action {
const actionHandler = super.handleSuccess(originalAction);
// return a factory to get a data handler to
// parse data from DataService and save to action.payload
return function(data: any) {
const action = actionHandler.call(this, data);
if (action && data && data.foo) {
// save the data.foo to action.payload.foo
(action as any).payload.foo = data.foo;
}
return action;
};
}
}
我也不确定这是否是解决此问题的正确方法,或者我是否正在解决这个问题太复杂了,我可以“简单地”以某种方式手动更新附加集合状态(在我的数据服务调用 getWithQuery() 中)并且如果是这样,最好/推荐的方法是什么。
干杯和感谢
加里
更新
在 Andrew 指出我明显的导入错误后,我现在已经实现了结果处理程序但出现以下错误
ERROR in Error during template compile of 'AdditionalPropertyPersistenceResultHandler'
Class AdditionalPropertyPersistenceResultHandler in D:/dev/angular/ng-vet/src/app/treatments/services/treatments-entity-result-handler.ts extends from a Injectable in another compilation unit without duplicating the decorator
Please add a Injectable or Pipe or Directive or Component or NgModule decorator to the class.
考虑到 stackblitz 这没有任何意义没有它,但效果很好。
我的实体元数据映射
const entityMetadata: EntityMetadataMap = {
TreatmentTemplate: {
entityDispatcherOptions: {
optimisticUpdate: true
}
},
Treatment: {
additionalCollectionState: {
totalRecords: 0
},
entityDispatcherOptions: {
optimisticUpdate: true
}
}
};
和提供者:
providers: [
TreatmentsDataService,
TreatmentEntityService,
TreatmentTemplateResolver,
TreatmentTemplatesDataService,
TreatmentTemplateEntityService,
{
provide: PersistenceResultHandler,
useClass: AdditionalPropertyPersistenceResultHandler
},
{
provide: EntityCollectionReducerMethodsFactory,
useClass: AdditionalEntityCollectionReducerMethodsFactory
}
]
我基本上是从 stackblitz 中复制粘贴的方法..
在 ^8.0.2 of angular 和 ^8.6.0 of ngrx 这可能是问题吗?
最佳答案
使用 additionalCollectionState
有一个注意事项。
默认的 QUERY_MANY_SUCCESS reducer 期望 action.payload.data
是一个实体数组,但 QUERY_MANY 操作 action.payload.data
将是 api 返回的任何内容。
说它返回
interface QueryManyAPIResponse<T> {
total: number,
entities: T[]
}
您可以将属性 total
添加到操作负载,但 action.payload.data
需要是实体。
@Injectable()
export class AdditionalPersistenceResultHandler extends DefaultPersistenceResultHandler {
handleSuccess(originalAction: EntityAction): (data: any) => Action {
const actionHandler = super.handleSuccess(originalAction);
return function(data: any) {
/** Default success action */
const successAction = actionHandler.call(this, data);
/** Change payload for query many */
if (successAction && data && data.total) {
(successAction as any).payload.total = data.total;
}
if (successAction && data && data.entities) {
(successAction as any).payload.data = data.entities;
}
return action;
};
}
}
这只是对操作进行更改。
虽然默认的 reducer 会处理实体,但 NgRx Docs 的第 2 步和第 3 步需要将总数作为属性添加到实体集合中。
pagination would need to know how many records exist and how many have been loaded
已加载的数量是可推导的(id.length,因此您可以为此使用选择器),因此不需要保存在商店中。
I have an entity collection and would like to store some additional information to reduce round trips to the server and also reduce redundant loading.
这是一个难题。我发现减少 api 调用的最干净、最直接的方法是使用服务器端分页表(请参阅下面的引用资料)并在表之前提供一个页面,该页面提供带有各种统计信息的仪表板(需要实现此 API)内置查询参数的过滤器和指向表格页面的链接。
如果数据已经在第 1 页,很少有人会花时间在分页的 mat 表中进行分页。
没有人愿意。
dashboard.component.html
<button
mat-raised-button
[routerLink]="['/procurement/orders']"
[queryParams]="{ awaitingPrices: 'yes', employeeID: userID }"
>
{{ statistics.awaitingPricesUser }}
</button>
orders.component.html(容器)
<app-order-find (filter)="onFilter($event)"></app-order-find>
<app-order-filters
[suppliers]="suppliers$ | async"
[employees]="employees$ | async"
[filters]="filters"
(filtersUpdate)="updateFilters($event)"
></app-order-filters>
<app-orders-table
[totalNumberOfOrders]="totalNumberOfOrders$ | async"
[filters]="filters"
(review)="onReview($event)"
(edit)="onEdit($event)"
(delete)="onDelete($event)"
>
></app-orders-table
>
您是否希望将所有数据加载到商店中,即在后台加载第 1、2、...、最后一页的分页数据。加载所有数据后,您可以完全通过选择器进行客户端分页。
如果您希望在表和详细信息 View 之间来回切换,或者在相同页面和相同过滤器上来回切换,您可以保留 { urlWithQueryParams: entityIds }
的缓存映射并使用选择器来获取从商店。如果删除相关实体,则需要丢弃这些。
服务器端分页表 - https://blog.angular-university.io/angular-material-data-table/
关于angular - 覆盖 NGRX DefaultPersistenceResultHandler 的 handleSuccess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60543031/
我已经建立了这个IStore: export interface IStore { user: IUser; sources: ISourceRedux; } 其中IUser是: export
store.select()发出先前的存储状态。 是否可以订阅从“此刻开始”的更改,而无需获取先前的商店值(value)? 最佳答案 如果您对第一个发出的值不感兴趣,则应该可以使用 skip 运算符:
我已将我的 ngrx 代码更新到版本 8(使用 Action Creator 等),但我现在不知道如何在 NgRx Store DevTools 中使用 Dispatcher。 在我能够发送这样的操作
我正在开发一个新的 angular 4 plus @ngrx 4 项目。 我希望对加载的数据具有搜索功能。 例如,所有联系人信息都已加载到组件中。 联系人列表将过滤与搜索文本匹配的联系人姓名。 Ple
我正在使用 Ngrx 和 Angular2 构建一个移动应用程序。当用户从我的应用程序中注销时,我想清除商店?谁能知道该怎么做? 最佳答案 您应该在每个 reducer 中有一个明确的操作,这将清理商
我看到很多代码示例,其中 store.dispatch() 调用直接发生在 Angular 组件中。让一个愚蠢的 Angular 组件访问整个 Store 不是很糟糕吗?为什么不将所有的 Action
ngrx 的支持者声称 (here for example),您可以并且应该将所有应用程序状态保存在单个 Store 中。这表明 @ngrx/Store 可以用于缓存,因为缓存的内容是一种应用程序状态
我的应用程序在调度某个 Action 时没有调度某些 Action 或某些效果没有被调用,这有问题(请参阅 ngrx effect not being called when action is di
下面的代码片段有什么作用?取自此 file . export const getCollectionLoading = createSelector(getCollectionState, fromC
如果在同一个商店上分派(dispatch)多个操作: store.dispatch(new SomeAction()); store.dispatch(new SomeOtherAction());
我试图了解 typeof 效果在 ngrx 中是如何工作的,如果我在我的应用程序模块中声明: .... @NgModule({ imports: [ EffectsModule
任何人都可以建议在角度应用程序中使用 ngrx 进行状态管理时如何控制台记录状态。我已经浏览了 ngrx-store-logger,但是文档并不清楚如何创建元 reducer 和使用这个库。 最佳答案
我一直在阅读ngrx示例应用程序的代码并找到两个函数调用 createFeatureSelector('auth'); 和 createSelector(selectAuthState,(state:
我正在使用 Angular 8 和 NGRX 8。我有一个操作: export const loadEnvironment = createAction( LicencingActionTypes
我正在使用 Angular 8 和 NGRX 8。我有一个操作: export const loadEnvironment = createAction( LicencingActionTypes
以下示例取自 @ngrx example . 我以这种方式理解这个 observable。第一map函数获取 payload这是要添加的书,再次由mergeMap处理它保存到数据库的位置。 原码:
我目前正在使用 NgRx Data 对我项目中的几个实体执行 CRUD 操作。现在,我必须开发分页。因此,REST API 响应将如下所示: { "page": 1, "per_pag
如何在 NGRX 中访问(读取)另一个 reducer 中的 reducer 状态?这是一个与 this 非常相似的问题.NGRX 是否为此提供任何其他解决方案? 最佳答案 我在考虑做类似的事情时偶然
我正在尝试按属性过滤掉有效负载数据。 //reducer.ts case MessagesActionTypes.LOAD_Message_SUCCESS: { console.lo
我有效果类,我想根据路由器参数 ID 加载详细信息 @Effect() getDetails$ = this.actions$.ofType(DetailActions.GET_DETAILS).
我是一名优秀的程序员,十分优秀!