【问题标题】:How to update nested object in Ember如何在 Ember 中更新嵌套对象
【发布时间】:2016-07-06 09:58:52
【问题描述】:

我正在使用 EmberJS 2.4 编写应用程序。我有以下服务 生成随机数据对象的对象:

export default Ember.Service.extend({
    crits: {},
    loadCrits() {
        var newCrits = {};
        var max = Math.random() * 10;
        for(var i=0; i<max; i++) {
            var crit = {};
            var num = Math.random() * 5;
            for(var j=0; j<num; j++) {
                crit["data"+j] = j;
            }

            newCrits["crit"+i] = crit;
        }

        this.set("crits", newCrits);
    }
});

我有一个在表格中显示数据的组件。对于每个嵌套对象的每个键值对,我都有一个按钮,以便用户可以更改值:

<table>
    {{#each-in critService.crits as |key crit|}}
    <tr>
        <td>key</td>
        <td><ul>
            {{#each-in crit as |k v|}}
                <li>
                    {{k}} = {{v}}
                    <button {{action "modifyCrit" crit k}}>change</button>
                </li>
            {{/each-in}}
        </ul></td>
    </tr>
    {{/each-in}}
</table>

组件如此处理动作:

export default Ember.Component.extend({
    critService: Ember.inject.service(),
    actions: {
        modifyCrit(crit, k) {
            Ember.set(crit, k, "new value");
        }
    }
});

问题是视图没有更新。如果我理解正确,这是因为 Ember 不知道如何将“crit”嵌套对象与来自的“critService”链接起来。因此没有触发事件/观察者来更新视图。

如何修改它,以便当用户单击按钮时,视图会更新为新值?

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

    您需要更改数据结构。我给你一个转折。请查看this twiddle

    【讨论】:

    • 好的,所以要点是我必须将 Ember.A() 用于数组,并将自定义对象类型用于键值对。但是,API 文档说“如果 Ember.EXTEND_PROTOTYPES 为真(默认值),则不需要 Ember.A”。这是否意味着我可以只使用常规的 javascript 数组而不是 Ember.A?而且我认为 Ember 不会扩展 Object 原型以避免必须使用 KeyValue 解决方法...
    • 可以使用原生数组
    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2022-12-21
    • 2023-01-22
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多