如何更新Ember

时间:2016-07-06 09:58:52

标签: javascript ember.js

我正在使用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不知道如何链接&#34;暴击&#34;嵌套对象与&#34; critService&#34;来自哪里。因此没有触发事件/观察者来更新视图。

如何修改此项,以便在用户点击按钮时,视图会使用新值更新?

1 个答案:

答案 0 :(得分:1)

您需要更改数据结构。我为你提供一个旋风。请查看this twiddle