【问题标题】:Angular 2 | cannot assign to array because it is a constant or a read-only property角 2 |无法分配给数组,因为它是常量或只读属性
【发布时间】:2017-09-23 03:25:56
【问题描述】:

我正在尝试向我的后端 api 发出一个 get 请求,该请求返回一个对象数组。我正在使用以下代码:

small.component.ts (调用 openDepositModal() 时,它从 auth.service.ts 调用函数 getUserInventory(),该函数向我的后端 api 发出 get 请求,然后返回一个包含对象的数组。)

[...]

export class Item{
    id: String;
    name: String;
    img: String;
    value: String;
}

const items: Item[] = [];

[...]

openDepositModal(){
    if(!items){
        this.authService.getUserInventory().subscribe(data => {
            items = data; <-- ERROR HERE
        });
    }
}

auth.service.ts

[...]

getUserInventory(){
    let headers = new Headers();
    this.loadToken();
    headers.append('Authorization', 'JWT ' + this.authToken);
    headers.append('Content-Type', 'application/json');
    return this.http.get('http://localhost:3000/api/user/inventory', { headers: headers })
    .map(res => res.json());
}

[...]

在 small.component.ts 内部,我试图将从服务中获得的数据插入到“items”数组中。但我收到错误“无法分配给数组,因为它是常量或只读属性”。有人可以修复我的代码吗?谢谢。 :-)

【问题讨论】:

    标签: javascript angular typescript


    【解决方案1】:

    使用let 而不是const

    例如let items: Item[] = [];

    const 声明类似于let 声明,但顾名思义,它们的值一旦绑定就不能更改。换句话说,它们与 let 具有相同的作用域规则,但您不能重新分配给它们。

    let vs. const (docs)

    鉴于我们有两种具有相似范围的声明 语义,我们很自然地会问使用哪一个。 与大多数广泛的问题一样,答案是:视情况而定。

    应用最小特权原则,除 那些你打算修改的应该使用 const。理由是,如果一个 变量不需要被写入,其他人在做同样的事情 代码库不应自动写入对象,并且 将需要考虑他们是否真的需要重新分配到 多变的。使用 const 还可以让代码在推理时更可预测 关于数据流。

    另一方面,let 不再比 var 写出,并且 许多用户会更喜欢它的简洁性。本手册的大部分内容使用 让声明符合该利益。

    【讨论】:

      【解决方案2】:

      将错误替换为this.items = data;

      【讨论】:

      • 不起作用,因为 items 数组在组件类之外
      【解决方案3】:

      因为您已将其声明为常量。将其声明为您的类中的属性,然后您可以为其赋值

      export class SmallComponent{
      private items: Item[] = [];
      
      [...]
      
      openDepositModal(){
          if(!items){
              this.authService.getUserInventory().subscribe(data => {
                  this.items = data; <-- HERE
              });
          }
      }
      

      如果它们在组件类之外,则将 const 更改为 let

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-09
        • 2018-12-07
        • 2018-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        相关资源
        最近更新 更多