Angular - 分派操作时出现“TypeError:无法冻结”

2024-01-05

我正在开发一个使用 ngrx 存储和效果的角度应用程序。我明白了

“类型错误:无法冻结”

从我的组件分派操作时出错。我写它是为了文件上传功能。我认为我正在改变状态,但不知道在哪里以及如何解决它。 这是我的详细代码:

Actions:

export enum FileUploadActionTypes {
    UploadFile = '[File Upload] Upload File',
    UploadFileSuccess = '[File Upload] Upload File Success',
    UploadFileFailure = '[File Upload] Upload File Failure'
}

export class UploadFile implements Action {
    readonly type = FileUploadActionTypes.UploadFile;

    constructor(public payload: any) {}
}

export class UploadFileSuccess implements Action {
    readonly type = FileUploadActionTypes.UploadFileSuccess;

    constructor(public payload: any) {}
}

export class UploadFileFailure implements Action {
    readonly type = FileUploadActionTypes.UploadFileFailure;

    constructor(public payload: any) {}
}

export type FileUploadActionsUnion = UploadFile | UploadFileSuccess | UploadFileFailure;

Service:

export class FileUploadService {
    constructor(private httpClient: HttpClient) {

    }
    uploadFile(file: any): Observable<any> {
        return this.httpClient.post<any[]>('/api-url/', file);
    }
}

Effect:

@Effect()
uploadFile$ = this.actions$.pipe(
    ofType<UploadFile>(FileUploadActionTypes.UploadFile),
    mergeMap(action => this.fileUploadService.uploadFile(action.payload).pipe(
        map(result => new UploadFileSuccess(result)),
        catchError(error => of(new UploadFileFailure(error)))
    ))
)

Reducer:

export interface State {
    fileUploadSuccessResponse: any,
    fileUploadFailureResponse: any
}

export const initialState = {
    fileUploadSuccessResponse: null,
    fileUploadFailureResponse: null
}

export const getFileUploadSuccessResponse = state => state.fileUploadSuccessResponse;
export const getFileUploadFailureResponse = state => state.fileUploadFailureResponse;

export function reducer(state: State = initialState, action: FileUploadActionsUnion):State {
    switch(action.type) {
        case FileUploadActionTypes.UploadFile: {
            return {
                ...state
            }
        }
        case FileUploadActionTypes.UploadFileSuccess: {
            return {
                ...state,
                fileUploadSuccessResponse: action.payload
            }
        }
        case FileUploadActionTypes.UploadFileFailure: {
            return {
                ...state,
                fileUploadFailureResponse: action.payload
            }
        }
        default: {
            return state;
        }
    }
}

您似乎正在使用ngrx-store-freezenpm 包。该包可确保您对商店所做的任何更新都不会直接发生变化。此过程的一部分是应用Object.freeze() to the payload您尝试发送的操作的对象。 IE。this.store.dispatch(new UploadFiles(file)).

默认行为为<input type="file">控制是将其值保存为FileList目的。由于该对象是原始数据类型,Javascript 会将其视为只读,从而阻止您写入其属性。这也解释了为什么Object.freeze()失败,因为它无法对只读数据类型应用冻结。

我最近使用 NGRX 遇到了同样的问题<input type="file">表单控制。修复方法是克隆FileList在发送到商店之前转换成一个新对象。

onChange(control: FormControl) {
  const primitiveFileList: FileList = control.value;
  const clonedFiles = { ...primitiveFileList };
  this.store.dispatch(new UploadFiles(clonedFiles));
}

如果其他人知道这种方法的任何潜在缺陷,我将不胜感激您的意见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular - 分派操作时出现“TypeError:无法冻结” 的相关文章

随机推荐

  • 有没有办法知道 NSUserNotificationCenter 中有多少个 NSUserNotification?

    Is there any non private way of knowing how many notifications there are in the Notification Center NSUserNotificationCe
  • 为什么 PDO fetchColumn() 在这里不起作用

    我正在尝试计算查询返回的行数 我正在这样做 what Norman stmt conn gt prepare select names as names from names where names what stmt gt bindPar
  • 如何为文本框添加效果到样式

    我试图向样式添加效果以便重用它 但由于某种原因它不起作用
  • Spring REST 返回 PDF - 响应状态 406(不可接受)

    我读了很多关于此类问题的问题 但他们都建议使用正确的杰克逊版本 这是我目前的情况 休息 API RequestMapping value get pdf id headers Accept method RequestMethod GET
  • Swift Combine:将发布者转变为只读 CurrentValueSubject

    有时我的视图模型使用 Published财产或PassthroughSubject 但我不希望它对外界可写 很简单 把它变成公共的AnyPublisher并将可写的保留为私有 如下所示 class ViewModel Published p
  • Google API Oauth .net core 3.1

    我有一个 net core 3 1 MVC Web 应用程序 我正在尝试开始使用一些谷歌 API 我发现谷歌文 档非常混乱 在官方文档中 我发现 MVC 库不支持 net core 有人可以为我指明正确的方向 我应该如何开始在 MVC ne
  • 使用 ArcGIS JS API 的 dojo 解析器和 TypeError

    我收到此错误 类型错误 未定义 不是函数 评估 parser parse 这是我的代码
  • 未启用时更改按钮背景

    我需要改变我的Button仅当未启用背景 例如 SolidColorBrush 时 IsEnabled false 我能怎么做 我要修改按钮吗Style使用 XAML 或者我可以通过编程方式完成这项工作吗 在未启用背景时仅更改背景的正确 X
  • 使用 jQuery 按顺序添加和删除类

    我想说的是 如果我的 div 没有活动类 请添加它 如果该类确实处于活动状态 请将其删除 我有以下内容 只有我的代码添加了该类 然后继续查询并在最后删除它 最好的解决方案是什么 2个单独的单击功能 work showcase click f
  • Woocommerce 根据所选的运输类别在结账时更改运输方式标题

    我想根据产品的运输类别更改商店结帐中显示的运输方式标题 e g 运输方式标题目前为统一费率 我有 2 个产品 如果购买产品 A 我需要它有 易碎品运输 如果购买产品 B 我需要它具有 标准运输 遗憾的是 我必须使用类来进行运输 因此其他方法
  • Angular 2 服务的异步初始化

    我有一个 Angular 2 服务 需要在初始化时执行异步工作 并且在初始化完成之前不应该使用 Injectable export class Api private user private storage constructor pri
  • Numpy 数组广播规则

    我在理解 Numpy 中数组广播的规则时遇到一些困难 显然 如果对两个具有相同维度和形状的数组执行逐元素乘法 一切都很好 另外 如果将多维数组乘以标量 它就会起作用 这我明白了 但是如果你有两个 N 维数组不同的形状 我不清楚广播规则到底是
  • 检测到 jQuery.ajax 调用因页面正在重新加载而失败?

    我进行了大量的 ajax 调用 并以抛出消息的方式处理来自它们的错误 我发现如果在页面重新加载时正在进行 ajax 调用 例如单击刷新 或导航到另一个 URL 然后我正在进行的 ajax 调用会触发它们的错误回调 如何区分真正的错误和因页面
  • 向 qmake 添加一个带有值的定义?

    如何使用 qmake 添加带有值的定义 例如 这在我的 pro 文件中不起作用 如我所料 DEFINES WINVER 0x0500 nor DEFINES WINVER 0x0500 如何在开始编译之前将 WINVER 定义为 0x050
  • 如何隐藏DataGridView的网格线? Winforms C#

    如何隐藏DataGridView的网格线 我在互联网上搜索过但没有找到解决方案 请帮忙 谢谢 你可以试试 MyGrid CellBorderStyle DataGridViewCellBorderStyle None
  • Android Spannable:如何清除颜色?

    我在 RecyclerView CardViews 的 SearchView 上设置了 Spannable 如果在 CardView 上找到用户输入的文本 则该文本将以红色突出显示 当 SearchView 行被清除时 我希望 CardVi
  • 有没有办法创建一个可以接受数组和范围作为输入的 VBA 函数?

    我正在尝试创建一个函数 它可以接受范围或数组来执行一些进一步的计算 当数组通过时 该函数工作正常 但是当该函数在工作表中的范围内使用时 它会给我值 错误 我的代码如下所示 Function COMRET data as variant N
  • 反思:为什么会有setAccessible()这样的方法?

    只是想知道 为什么发明 Java 的人要写这样的方法setAccessible boolean flag 这使得访问修饰符 特别是私有的 无用并且无法保护字段 方法和构造函数不被访问 看下面的简单例子 public class BankAc
  • 如何在matplotlib中使颜色条一端的颜色变深?

    假设我有以下情节 import numpy as np import matplotlib pyplot as plt np random seed 1 data np sort np random rand 8 12 plt figure
  • Angular - 分派操作时出现“TypeError:无法冻结”

    我正在开发一个使用 ngrx 存储和效果的角度应用程序 我明白了 类型错误 无法冻结 从我的组件分派操作时出错 我写它是为了文件上传功能 我认为我正在改变状态 但不知道在哪里以及如何解决它 这是我的详细代码 Actions export e