【问题标题】:Multiple payload on NGRX action/effectNGRX 动作/效果上的多个有效载荷
【发布时间】:2018-02-05 08:44:20
【问题描述】:

我需要使用 ngrx/effect 向 API 发送一个 put 请求,但该请求需要 id 和 content 以便 MongoDB 能够找到一个帖子。

这里是代码,我尝试设置两个动作载荷:

export class UpdatePost implements Action {
    readonly type = UPDATE_POST

    constructor(public payload: string & Post ) { }
}

效果如下:

@Effect() 
    editPost$: Observable<Action> = this.actions$
    .ofType(PostActions.UPDATE_POST)
    .map((action: PostActions.UpdatePost) => action.payload)
    .switchMap((?) => {
        return this.postService.editPost(id, post);
    })
    .map(editedpost => ({type: PostActions.UPDATE_POST_SUCCESS, payload: editedpost}))
}

editPost() 需要两个参数:id 和 content。

我想我的操作负载应该设置为另一种方式,我是ngrx 的新手,所以欢迎每个建议。

【问题讨论】:

  • 你可以定义一个由 2 个属性组成的有效负载,或者一个带有 2 个参数的构造方法

标签: javascript angular mongodb ngrx ngrx-effects


【解决方案1】:

当你声明一个string&Post类型的变量时,意味着这个变量拥有Post的所有方法和string的所有方法。那可能不是你想要的。 您希望您的操作有一个标识符(字符串类型)和一个帖子。您可以为此声明一个接口,或者您的操作可以具有多个属性,例如:

export class UpdatePost implements Action {
  readonly type = UPDATE_POST

  constructor(public id: string, public payload: Post ) { }
}

那么你可以这样写:

@Effect() 
    editPost$: Observable<Action> = this.actions$
    .ofType(PostActions.UPDATE_POST)
    .switchMap(action => {
        return this.postService.editPost(action.id, action.post);
    })
    .map(editedpost => ({type: PostActions.UPDATE_POST_SUCCESS, payload: editedpost}))
}

【讨论】:

  • 如果你正在更新一个 Post 意味着它已经被创建了,所以 id 应该在 Post 实例的有效负载中。我认为您不需要两个参数。
  • @PierreMallet 我同意你的观点,但 merko 的 Post 对象中似乎不存在 id。可能是一个糟糕的设计,但我回答了它的问题。
猜你喜欢
  • 2019-01-31
  • 2017-12-30
  • 2017-06-16
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2018-11-22
相关资源
最近更新 更多