我试图在我的减速器上使用 Object Spread 和 @ngrx 以及 Angular 和 TypeScript,但是,我不断在控制台中收到此错误:
引用错误:__assign 未定义
这是我的代码:
case INCREMENT: {
return state = {
...state,
counter: state.counter++
}
}
Run Code Online (Sandbox Code Playgroud)
但如果我按照下面的代码执行,我可以很好地运行代码:
case INCREMENT: {
return Object.assign({}, state, {
counter: state.counter++
}
}
Run Code Online (Sandbox Code Playgroud)
我在另一个问题中读到这可能与打字稿版本有关,但我正在使用"typescript": "~2.2.1".
我错过了什么吗?
编辑:
按照评论中的要求添加 tsconfig.js。
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"noEmitHelpers": true,
"noEmitOnError": true,
"lib": [
"es6",
"dom",
"es2015.iterable"
],
"baseUrl": ".",
"paths": {
"*": [
"./node_modules/tns-core-modules/*",
"./node_modules/*"
]
}
},
"exclude": [
"node_modules", …Run Code Online (Sandbox Code Playgroud) 最新版本的 NgRx/store,特别是 NgRx 是否与 Angular 4 兼容?如果没有,我需要将哪个版本的 NgRx 与 Angular 4 一起使用?
另外,NgRx/store 4 与版本 6 有很大不同吗?例如,如果我学习版本 6,过渡到版本 4 会遇到困难吗?
抱歉,如果这个问题太基础了,我无法通过谷歌找到答案。
Angular 5 和 NGRX 5
我试图在用户单击搜索按钮后运行一些自定义验证,如果验证成功,则路由到新页面。
我有一个 isError 可观察对象,它正在从我的商店中填充:
isError$: Observable<boolean>;
ngOnInit() {
this.isError$ = this.store$.select(
ShipmentLookupStoreSelectors.selectShipmentLookupError
);
}
Run Code Online (Sandbox Code Playgroud)
我在我的商店中调用搜索操作,如下所示:
onSearch() {
this.store$.dispatch(new ShipmentLookupStoreActions.Search());
}
Run Code Online (Sandbox Code Playgroud)
我感到困惑的是如何/何时实际路由到新页面?我本质上想要发生的是:
运行验证
如果成功->路由到新页面
如果失败 -> 停留在更新状态的同一页面上(isError 状态将更新为 true,我可以正常工作)
我研究过 ngrx router-store 但总体上对实现此功能的最佳方法感到困惑。
我需要实现无限滚动,因为我的后端响应仅限于 100 个项目。因此,在第一页尝试中,我从后端收到 100 个项目。每次滚动到页面末尾时,我都需要调用另外 100 个项目的端点。
在我的子组件 ( BpHistoryListInfiniteComponent) 中,我设置了data-load用于在 100. 元素进入视图时进行跟踪的属性。然后IntersectionObserver在Subject( pageByScroll$)中设置data-load属性的值。我pageByScroll$需要从 0 开始(对于第一页尝试),并且我使用它distinct()是因为我需要distinct已经加载的项目,然后将该值发送到我的父组件。
但是在父组件中使用过滤器之一后,我需要将index值重置为 0 并将其和过滤器值发送到后端(并且仅接收 100 个项目),然后如果用户滚动到底部,我需要index再次从 0 增加我的值,但distinct()不是请允许我这样做。
我需要以某种方式重置不同的值。
//子组件的html部分
<div #infiniteScrollMadness class="column">
<div *ngFor="let item of history; let i = index" class="list" [attr.data-load]="(i + 1) % 100 == 0 ? (i + 1) : null">
<span>{{ item.id }}</span>
<span>{{ item.name }}</span>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
子组件的 .ts 部分 …
我有一个带有 props 的选择器(类型为 MemoizedSelectorWithProps)。我想在 WithLatestFrom 内的效果中使用它。问题是 - 选择器的参数(道具)来自操作负载。我无法使 withLatestFrom 访问操作有效负载。
我正在使用 Angular 7(当然还有 ngrx7)。我尝试使用地图以某种方式创建一个新的可观察对象,但没有任何效果......
这些是我在这里写的一些演示行,以简化我的用例:
行动:
export const GET_INVENTORY = '[App] Get Inventory';
export class GetInventory implements Action {
readonly type = GET_INVENTORY;
constructor (public branchId: number) {}
}
Run Code Online (Sandbox Code Playgroud)
影响:
@Effect()
getInventory$ = this.actions$.pipe(
ofType(GET_INVENTORY)
withLatestFrom(this.store$.pipe(select(getIsStoreInventoryLoaded, {branchId: action.branchId}))), // this is not working obviously, since action is unknown
switchMap([action, loaded]: [GetInventory, boolean] => {
if (loaded) {
console.log('already loaded inventory for this branch', action.branchId);
} else {
console.log('never loaded inventory …Run Code Online (Sandbox Code Playgroud) 给定一个看起来像这样的模板
<some-component
*ngIf="someColdObservable$ | async"
[result]="someColdObservable$ | async"
></some-component>
Run Code Online (Sandbox Code Playgroud)
和一个看起来像这样的 observable:
someColdObservable$: this.store.pipe(
select(isAllowedToDoThis),
filter(Boolean),
flatMap(() => apiRequest())
);
Run Code Online (Sandbox Code Playgroud)
该someColdObservable$被订阅两次(如预期),这反过来问题的两个API调用(这显然是一个代码味道,但让我们无视此刻)。
在这种情况下some-component不包含任何空检查,AsyncPipe如果在模板中评估apiRequest之前没有发出值AsyncPipe导致some-component抛出cannot access x of null(此时[result]仍然为空),则将返回空值,请参阅AsyncPipe参考源。
这是所有预期的行为(或至少在阅读源代码之后)但是,当我尝试通过添加shareReplayto来缓解发出两个请求someColdObservable$的问题时,我还解决了[result]在apiRequest()发出值之前为 null的问题。这对我来说毫无意义,因为我希望AsyncPipe仍然在null _latestValue这里返回一个,而使cannot access x of null错误未修复。但出于某种原因,添加shareReplay修复了上述两个问题。
这类似于共享时的 Angular 可观察行为奇怪,但仍然存在未解决的问题,即为什么要shareReplay解决此问题。
有人能指出我在这里缺少什么以及为什么在发出值之前AsyncPipe不再返回吗?nullapiRequest() …
我有 3 个字段与类型为数字的表单相关联,当我修改字段 A 时,它会修改字段 B 和 C,当我修改字段 B 时,它会修改字段 A 和 C,当我修改字段 C 时,它会相应地修改字段 A 和 B。
我的组件如下:
this.form= this.formBuilder.group({
fieldA: new FormControl(this.valueA),
fieldB: new FormControl(this.valueB),
fieldC: new FormControl(this.valueC),
});
onFieldAchanged() {
//Do some calculs
this.form.get('fieldB').setValue(x);
this.form.get('fieldC').setValue(y);
}
onFieldBchanged() {
//Do some calculs
this.form.get('fieldA').setValue(x);
this.form.get('fieldC').setValue(y);
}
onFieldCchanged() {
//Do some calculs
this.form.get('fieldA').setValue(x);
this.form.get('fieldB').setValue(y);
}
Run Code Online (Sandbox Code Playgroud)
和我的模板如下:
<input formControlName="fieldA" type="number" class="form-control" (ngModelChange)="onFieldAchanged()"/>
<input formControlName="fieldB" type="number" class="form-control" (ngModelChange)="onFieldBchanged()"/>
<input formControlName="fieldC" type="number" class="form-control" (ngModelChange)="onFieldCchanged()"/>
Run Code Online (Sandbox Code Playgroud)
当您修改其中一个字段时,问题就会出现,它会进入一个循环并使应用程序崩溃。
我已经尝试emitEvent: false在我的中添加参数setValue()但它没有改变
所以我的问题:有没有办法防止触发其他功能?当我修改时,fieldA …
我按照 Mike Ryan 在本视频中的建议为我的应用程序创建了独特的操作, 但我有一些操作会导致相同的状态转换。如何在不绕过最佳实践的情况下实现相同的状态转换,即为两个不同的事件调用一个公共操作?
我的行动是
export const rawSignalEditInplace = createAction(
RawSignalsActionTypes.RAW_SIGNAL_EDIT_INPLACE,
props<{ signal: RawSignal }>()
);
export const rawSignalEdit = createAction(
RawSignalsActionTypes.RAW_SIGNAL_EDIT,
props<{ signal: RawSignal }>()
);
Run Code Online (Sandbox Code Playgroud)
我的减速机是
on(rawSignalsActions.rawSignalEditInplace, (state, { signal }) => {
return {
...state,
selectedRawSignal: entitiesSelectors.selectEntities(state)[signal.id]
};
}),
on(rawSignalsActions.rawSignalEdit, (state, { signal }) => ({
...state,
selectedRawSignal: entitiesSelectors.selectEntities(state)[signal.id]
})),
Run Code Online (Sandbox Code Playgroud) 如何将mergeMap操作排入队列,以便仅在上一个完成时才一一执行?
TLDR:我有一个isLoading选择器,我想在我的守卫中使用它来仅在此选择器为假时激活路线。
这是减速器:
export const initialState: State = {
loaded: false,
loading: false,
success: {
[...]
}
};
export const reducer = createReducer(
initialState,
on(
fromApiActions.loadRequest,
(state): State => ({
...state,
loading: true
})
),
on(
fromApiActions.loadRequestSuccess
(state, partialState): State => ({
...state,
loaded: true,
loading: false,
success: {
...state.success,
...partialState
}
})
),
on(
fromApiActions.loadRequestFail,
(state): State => ({
...state,
loaded: false,
loading: false
})
)
);
Run Code Online (Sandbox Code Playgroud)
我有一个loading从状态中选择的选择器。在引导应用程序时,我正在调度LoadRequest变为loadingtrue 的操作。
这是我的守卫:
export class …Run Code Online (Sandbox Code Playgroud)