2016-07-06 50 views
0

我正在使用EmberJS 2.4编写一个应用程序。我有以下服务, 生成随机数据的对象的对象:如何更新Ember中的嵌套对象

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不知道如何将“暴击”嵌套对象与“critService”链接起来。因此没有触发事件/观察者会更新视图。

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

回答

1

您需要更改数据结构。我为你提供了一个旋律。请检查出this twiddle

+0

好的,所以要点是我必须使用Ember.A()作为数组,并且为键值对使用自定义对象类型。但是,API文档指出,如果Ember.EXTEND_PROTOTYPES为真(默认值),则不需要“Ember.A”。这是否意味着我可以使用常规的JavaScript数组而不是Ember.A?我认为Ember不会扩展对象原型以避免必须使用KeyValue解决方法... – Kricket

+1

您可以使用本地数组 –