【问题标题】:How can I change a data parameter in Angular 2?如何更改 Angular 2 中的数据参数?
【发布时间】:2018-08-14 14:27:44
【问题描述】:

我在更改组件文件中的数据参数时遇到问题:

this.commandList.ListesCommandesATransmettre.forEach(data => {
    this.catalogs.forEach(catalog => {
        if (catalog.Libelle === data.Catalogue) {
            if (catalog.selected === false) {
                console.log(data.isSelected)
                data.isSelected = false;
                console.log(data.isSelected)
                console.log(data);
            }
        }
    })
});

此代码显示:

是的
假的

但是console.log(data)isSelected的值还是true。那么,为什么结果是false

【问题讨论】:

  • 您能否提供变量 this.commandList 和 this.catalogs 的示例?请
  • 我认为这是因为您有 2 个 foreach 循环。所以控制台正在显示它拥有的最新的data。尝试做console.log(JSON.stringify(data));。或者在你的循环之外做一个console.log(this.commandList);
  • rhavelka : 我在 console.log(JSON.stringify(data)) 内有 isSelected = false;
  • 我在 Stackblitz 上复制了类似的东西,它可以工作 angular-yfgsay.stackblitz.io

标签: arrays angular typescript parameters boolean


【解决方案1】:

如果是回调的循环问题,试试这个

for (let data of this.commandList.ListesCommandesATransmettre) {
  for (let catalog of this.catalogs) {
    if (catalog.Libelle === data.Catalogue) {
      if (catalog.selected === false) {
        console.log(data.isSelected)
        data.isSelected = false;
        console.log(data.isSelected)
        console.log(data);
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    我无法理解您的代码逻辑。如果this.catalogs 有很多符合条件的目录会怎样? isSelected 将多次设置为 false。

    也许这行得通(如果我理解你的逻辑的话):

    this.commandList.ListesCommandesATransmettre = this.commandList.ListesCommandesATransmettre.map(data => {
        const mutateData = Object.assign({}, data);
    
        // If condition math, then isSelected set in false. Else, isSelected keep the his value
        mutateData.isSelected = 
            this.catalogs.some(catalog => catalog.Libelle === data.Catalogue && !catalog.selected) ? false : mutateData.isSelected;
    
        return mutateData;
    })
    

    【讨论】:

      【解决方案3】:

      试试这个代码来测试它是否正确更新。循环将判断哪些是真/假,您可以在更新的数据中查看是否是这种情况。

      this.commandList.ListesCommandesATransmettre.forEach((data, index) => {
          this.catalogs.forEach(catalog => {
              if (catalog.Libelle === data.Catalogue) {
                  if (catalog.selected === false) {
                      data.isSelected = false;
                  }
                  console.log(index + 'is selected: ' + data.isSelected)
              }
          })
      });
      console.log(this.commandlist);
      

      我注意到网络浏览器只会将对象的“最新”引用保留在内存中。因此,循环结束后,“最新”参考是最后一个触发。因此,您可能正在查看最后一个对象,而不是您要测试的对象。如果其他人知道更多,或者对实际发生的事情有参考,请编辑这篇文章。

      【讨论】:

        猜你喜欢
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-22
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        • 2020-04-26
        相关资源
        最近更新 更多