javascript - Ember 在服务的数组对象中设置值

标签 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'},
    ....
],
});

在我的 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”,但我仍然收到该错误:

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

最佳答案

数组内的对象:

{"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/

相关文章:

javascript - 如何动态附加一个div和一个图像?

ember.js - Ember 并发超时卡在 qunit

javascript - 在 EmberJS 中重新绑定(bind)时,数组值不会得到反射(reflect)

ember.js - 如何将 id 添加到 ember.js linkto 生成的 href?

javascript - 为什么通过 JavaScript 更改背景颜色会覆盖对象上的所有 CSS 选择器?

javascript - 自动滚动到每个 div 暂停,然后继续前进

javascript - AngularJS 的 404 图片加载问题

javascript - 在reactjs中设置时间间隔的问题

ember.js - 用于显示/编辑和创建的相同 Ember.JS 模板

javascript - 如果使用backbone.js 或ember.js,如何隐藏应用程序逻辑?