标签: ngrx

无法将 Object Spread 与 TypeScript 和 @ngrx 一起使用

我试图在我的减速器上使用 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)

typescript ngrx ngrx-store

1
推荐指数
1
解决办法
982
查看次数

我可以将哪个版本的 NgRx 与 Angular 4 一起使用

最新版本的 NgRx/store,特别是 NgRx 是否与 Angular 4 兼容?如果没有,我需要将哪个版本的 NgRx 与 Angular 4 一起使用?

另外,NgRx/store 4 与版本 6 有很大不同吗?例如,如果我学习版本 6,过渡到版本 4 会遇到困难吗?

抱歉,如果这个问题太基础了,我无法通过谷歌找到答案。

ngrx angular

1
推荐指数
1
解决办法
1796
查看次数

操作完成后的路由 - NGRX 和 Angular

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 但总体上对实现此功能的最佳方法感到困惑。

ngrx angular ngrx-router-store

1
推荐指数
1
解决办法
3240
查看次数

如何在 angular2 中重置 RxJS 不同

我需要实现无限滚动,因为我的后端响应仅限于 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 部分 …

javascript rxjs ngrx angular

1
推荐指数
1
解决办法
377
查看次数

如何在带有来自操作的道具 (MemoizedSelectorWithProps) 的选择器效果中使用 withLatestFrom

我有一个带有 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)

javascript rxjs typescript ngrx angular

1
推荐指数
1
解决办法
3548
查看次数

仅当订阅未共享时 AsyncPipe 初始值为 null

给定一个看起来像这样的模板

<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() …

rxjs ngrx angular-pipe angular ngrx-store

1
推荐指数
1
解决办法
1055
查看次数

有没有办法防止 formControl 触发事件?

我有 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 …

typescript ngrx angular

1
推荐指数
1
解决办法
1873
查看次数

如何在 Reducer 中为多个动作执行相同的状态转换

我按照 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)

ngrx typescript-typings typescript2.0 angular ngrx-store

1
推荐指数
1
解决办法
316
查看次数

1
推荐指数
1
解决办法
157
查看次数

使用 ngrx 和选择器等待资源加载到守卫中

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)

rxjs ngrx angular

1
推荐指数
1
解决办法
541
查看次数