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

t5fffqht  于 2024-01-07  发布在  Windows
关注(0)|答案(1)|浏览(192)

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

  1. export default class YourComponent extends Component {
  2. objArr = [ {id:1, list:[1,2,3]}, {id:2, list:[3,4]} ];
  3. get combinedList() {
  4. if (this.objArr.length > 1) {
  5. let list = [];
  6. this.objArr.forEach((item) => {
  7. list.push(...item.list);
  8. });
  9. return list;
  10. }
  11. return this.objArr[0].list;
  12. }
  13. // Call this method when adding a new item
  14. addComment(newItem) {
  15. this.combinedList.unshiftObject(newItem);
  16. }
  17. }

字符串

2ekbmq32

2ekbmq321#

给定此代码:

  1. export default class YourComponent extends Component {
  2. objArr = [ {id:1, list:[1,2,3]}, {id:2, list:[3,4]} ];
  3. get combinedList() {
  4. if (this.objArr.length > 1) {
  5. let list = [];
  6. this.objArr.forEach((item) => {
  7. list.push(...item.list);
  8. });
  9. return list;
  10. }
  11. return this.objArr[0].list;
  12. }
  13. // Call this method when adding a new item
  14. addComment(newItem) {
  15. this.combinedList.unshiftObject(newItem);
  16. }
  17. }

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

    • 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时它都是一个稳定的引用:

  1. import { cached } from '@glimmer/tracking';
  2. // ...
  3. @cached
  4. get combinedList() {
  5. // ...
  6. }

解析#3

  1. addComment(newItem) {
  2. this.combinedList.unshift(newItem);
  3. }

解析#4

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

解析#5

  1. import { TrackedArray } from 'tracked-built-ins';
  2. // ...
  3. @cached
  4. get combinedList() {
  5. if (this.objArr.length > 1) {
  6. let list = new TrackedArray();
  7. this.objArr.forEach((item) => {
  8. list.push(...item.list);
  9. });
  10. return list;
  11. }
  12. return new TrackedArray(this.objArr[0].list);
  13. }


这将允许unshift更新UI

展开查看全部

相关问题