我试图设置属性' show'一个对象,来自一个由服务提供服务的数组。
服务(不是问题):
// services/events.js
export default Ember.Service.extend({
types: [
{"code": 0, "label": 'Performance', "show": true, "css": 'warning'},
{"code": 1, "label": 'Preview', "show": true, "css": 'danger'},
....
],
});
在我的控制器中,我有一个应该更新属性' show':
的操作// controller
const { service } = Ember.inject;
export default Ember.Controller.extend({
eventsService: service('events'),
....
actions: {
setEventFilter: function(code) {
....
let obj = this.get('eventsService.types').objectAt(code);
// I get a proper Object here, that also has a set-function:
console.log(obj);
// this fails with 'Uncaught TypeError: obj.set is not a function':
obj.set('show', false);
}
}
});
我已经在这里阅读了答案Ember: set array value for specific key,尝试了所有可能性,在我的案例中没有任何效果。
我不明白的是,我可以看到功能'设置'在控制台,但我仍然得到错误:
有什么建议吗?有人知道我做错了吗?
我也尝试过:
console.log(obj.show); // working! gives me right value
console.log(obj.get('show'); // same error (but with get of course...)
obj.show = false; // gives error 'Assertion Failed: You must use Ember.set() to set the `show` property (of [object Object]) to `false`.'
答案 0 :(得分:1)
数组中的对象:
{"code": 0, "label": 'Performance', "show": true, "css": 'warning'},
不是Ember对象,因此当然没有定义set
方法。您可以通过简单地说
obj.show = false;
当然,这不允许您从此对象挂起计算属性或观察者(或动态更新对模板中其属性的引用),因为作为POJO,它也没有任何可用的机制。如果你想把它当作一个Ember对象,那么它必须是一个Ember对象,比如
types: [
Ember.Object.create({"code": 0, "label": 'Performance', "show": true, "css": 'warning'}),
Ember.Object.create({"code": 1, "label": 'Preview', "show": true, "css": 'danger'}),
....
],
这将使子对象成为Ember对象,但types
仍然是一个普通的旧JS对象,所以你仍然无法做到像
typeCss: Ember.computed.map('types', 'css')
所以如果你想要那种东西工作,你必须使数组本身也成为Ember对象。
Ember.set(obj, prop, val)
有效的原因是Ember.set
知道如何在POJO上工作。请注意,在某些情况下,一些类似Ember的东西将在POJO上工作,但我不会依赖它们。
作为旁注,此行为与来自服务的对象无关。