Ember pushObjects() 未通知计算 属性
Ember pushObjects() not notifying computed property
我正在尝试使用 ember-light-table
,但在更新我的对象数组时遇到了一些问题。
当我使用操作 updateList()
时,我可以看到两个数组都发生了变化(adding/removing 个对象到列表中),但是未触发计算的 属性 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'));
}
}
只要确保 tableModel
应该是模板或代码中的 accessed/required。
Computed 属性 是惰性的,因此当您在代码或模板中请求它时,它会被计算。否则,它不会被调用。
第一次调用时,结果会是 return 并且会被缓存。后续访问将从缓存中获取它。更改任何依赖属性都会导致缓存失效,以便计算函数在下一次访问时再次运行。
大部分复制自 guides.emberjs
我正在尝试使用 ember-light-table
,但在更新我的对象数组时遇到了一些问题。
当我使用操作 updateList()
时,我可以看到两个数组都发生了变化(adding/removing 个对象到列表中),但是未触发计算的 属性 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'));
}
}
只要确保 tableModel
应该是模板或代码中的 accessed/required。
Computed 属性 是惰性的,因此当您在代码或模板中请求它时,它会被计算。否则,它不会被调用。 第一次调用时,结果会是 return 并且会被缓存。后续访问将从缓存中获取它。更改任何依赖属性都会导致缓存失效,以便计算函数在下一次访问时再次运行。
大部分复制自 guides.emberjs