ember.js unshiftObject方法在Windows中不起作用

t5fffqht  于 11个月前  发布在  Windows
关注(0)|答案(1)|浏览(153)

我有一个Object数组,只想concat所有对象的list属性,并创建一个新数组。所以我在下面的代码中有一个“combinedList”getter,如果数组长度大于1,则组合列表,否则只返回第一个项目列表属性。这个返回的数组将在模板文件中使用以显示。如果添加任何新项目,addComment函数将使用新添加的项调用,并将其推送到“combinedList”数组。
这里的问题是,如果objArr长度小于1,newItem将被推送到“combineList”。但是,如果它大于1,newItem不会被推送到“combinedList”数组。
有人能帮我找出这个问题的原因吗?

export default class YourComponent extends Component {
  objArr = [ {id:1, list:[1,2,3]}, {id:2, list:[3,4]} ];

  get combinedList() {
    if (this.objArr.length > 1) {
      let list = [];
      this.objArr.forEach((item) => {
        list.push(...item.list);
      });
      return list;
    }
    return this.objArr[0].list;
  }

  // Call this method when adding a new item
  addComment(newItem) {
    this.combinedList.unshiftObject(newItem);
  }
}

字符串

2ekbmq32

2ekbmq321#

给定此代码:

export default class YourComponent extends Component {
  objArr = [ {id:1, list:[1,2,3]}, {id:2, list:[3,4]} ];

  get combinedList() {
    if (this.objArr.length > 1) {
      let list = [];
      this.objArr.forEach((item) => {
        list.push(...item.list);
      });
      return list;
    }
    return this.objArr[0].list;
  }

  // Call this method when adding a new item
  addComment(newItem) {
    this.combinedList.unshiftObject(newItem);
  }
}

字符串
有几件事会让你的生活更轻松:

    • getter不能改变数据 *
  • 没有违规,所以我们很好,
  • ️每次调用getter时,都会重新运行getter(它们就像方法一样)
  • 这意味着每次访问combinedList时,您都可以获得一个新的list对象。
  • unshiftObject不是Array.prototype上的属性--您可能需要unshifthttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift
  • 方法必须具有绑定this(JavaScript无用)
  • 如果UI无论如何都要呈现combinedList,则需要启用自动跟踪

解析#2

在它上面添加一个@cached,这样每次访问combinedList时它都是一个稳定的引用:

import { cached } from '@glimmer/tracking';

// ...

@cached
get combinedList() {
  // ...  
}

解析#3

addComment(newItem) {
    this.combinedList.unshift(newItem);
  }

解析#4

addComment = (newItem) => this.combinedList.unshift(newItem);

解析#5

import { TrackedArray } from 'tracked-built-ins';

// ...

  @cached
  get combinedList() {
    if (this.objArr.length > 1) {
      let list = new TrackedArray();
      this.objArr.forEach((item) => {
        list.push(...item.list);
      });
      return list;
    }
    return new TrackedArray(this.objArr[0].list);
  }


这将允许unshift更新UI

相关问题