我正在尝试设置一个对象的属性“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'},
....
],
});
在我的 Controller 中,我有一个应该更新属性“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 ,尝试了所有的可能性,但在我的情况下没有任何效果。
我不明白的是,我可以在控制台中看到函数“set”,但我仍然收到该错误:
有什么建议吗?有人知道我做错了什么吗?
我也尝试过:
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`.'
最佳答案
数组内的对象:
{"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 上工作,但我不会依赖它们。
顺便说一句,此行为与来自服务的对象无关。
关于javascript - Ember 在服务的数组对象中设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524436/