Ember在Service的对象中设置值

时间:2016-04-10 00:41:11

标签: javascript ember.js

我试图设置属性' 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,尝试了所有可能性,在我的案例中没有任何效果。

我不明白的是,我可以看到功能'设置'在控制台,但我仍然得到错误:

enter image description here

有什么建议吗?有人知道我做错了吗?

我也尝试过:

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`.'

1 个答案:

答案 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上工作,但我不会依赖它们。

作为旁注,此行为与来自服务的对象无关。