【问题标题】:Ember pushObjects() not notifying computed propertyEmber pushObjects() 不通知计算属性
【发布时间】:2017-06-07 01:34:45
【问题描述】:

我正在尝试使用 ember-light-table,但在更新我的对象数组时遇到了一些麻烦。

当我使用updateList() 操作时,我可以看到两个数组都在发生变化(向列表添加/删除对象),但不会触发计算属性tableModel

我认为pushObjects() 可以解决问题,但由于某种原因它没有通知(它正在添加)。我还尝试使用Ember.A() 初始化 select_people,尽管[] 应该已经是一个 ember 数组...

我的混音:

// table-testing
import Ember from 'ember';
import Table from 'ember-light-table';

export default Ember.Mixin.create({
  table: null,
  tableColumns: null,
  tableModel: null,
  init() {
    this._super(...arguments);
    let table = new Table(this.get('tableColumns'), this.get('tableModel'), { enableSync: this.get('enableSync') });
    this.set('table', table);
  }
});

我的控制器

import Ember from 'ember';
import TableTesting from '../mixins/table-testing';
const { computed } = Ember;

export default Ember.Controller.extend(TableTesting, {
  tableColumns: computed(function() {
    return [{
      label: 'First Name',
      valuePath: 'firstName',
      width: '50%',
      sortable: false,
    }, {
      label: 'Last Name'
      valuePath: 'lastName',
      width: '50%'
    }]
  }),
  tableModel: computed('selected_people.@each.firstName', function() {
    // THIS MESSAGE ONLY SHOW WHEN VIEW IS RENDERED
    // I've tried .[], .@each, .length... none of them worked and I believe @each.firstName would be the most appropriated from what I've read
    console.log('computed method not showing',this.get('selected_people'));
    return this.get('selected_people');
  }),
  init() {
    this._super(...arguments);
    this.set('selected_people',[]);
  },
  actions: {
    updateList(item, moveToList) {
      let removeFromList, fromList, toList;
      if (moveToList === 'people') {
        removeFromList = 'selected_people'
      } else if (moveToList === "selected_people") {
        removeFromList = 'people';
      }
      // get the object lists
      fromList = this.get(removeFromList);
      toList = this.get(moveToList);
      // update list ---> HERE I UPDATE USING KOVL METHOD
      toList.pushObjects(item);
      fromList.removeObjects(item);
      console.log('update!',this.get('selected_people'));
    }
}

【问题讨论】:

  • 您的代码对我来说很完美。如果您可以在 twiddle 中重现它,它将帮助我们了解正在发生的事情。只需确保在调用updateList 函数后模板应该访问/需要tableModel。您可能会在 if 块内访问 tableModel 属性,这可能是错误的,或者不呈现特定块意味着它不会执行计算的属性。
  • 不应该是pushObjectremoveObject,单数吗?
  • @kumkanillam,我会尝试在旋转中重现。我不在其他任何地方使用 tableModel。我使用在使用 this.get('tableModel') 的 mixin 中创建的对象表...也许这就是问题所在!
  • @locks,这些方法存在。您使用对象数组而不是一个对象您可以检查 API here
  • 我在我的模板上对 modelTable 进行了一次迭代,但它没有帮助......我会看看我是否可以在 twiddle 上做点什么

标签: javascript ember.js


【解决方案1】:

只要确保tableModel 应该被模板或代码访问/需要。

Computed 属性是惰性的,因此当您在代码或模板中请求它时会计算它。否则,它不会被调用。 第一次调用时,它会返回结果并被缓存。后续访问将从缓存中获取。更改任何相关属性会导致缓存失效,以便计算函数在下一次访问时再次运行。

大部分抄自guides.emberjs

【讨论】:

  • 请随时根据您的具体研究以及您如何解决它来更新我的答案...您是成功的人
猜你喜欢
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
相关资源
最近更新 更多