Javascript 嵌套对象的双向绑定失败

Javascript 嵌套对象的双向绑定失败,javascript,ractivejs,Javascript,Ractivejs,我正在尝试实现,下面是我的模板 {{#with referNames(names, active, contacts)}} <!-- also tried {{#with names[contacts[active].names[contacts[active].active]]}} --> {{name}} <input value="{{active.data}}" /> <input type="button" value="clo

我正在尝试实现,下面是我的模板

 {{#with referNames(names, active, contacts)}}
 <!-- also tried {{#with names[contacts[active].names[contacts[active].active]]}} -->
    {{name}}
    <input value="{{active.data}}" />
    <input type="button" value="clone active" on-click="clone" />
 {{/with}}
还有JS代码

var r = new Ractive({
   template : "#template",
   el : document.body,
   data : data
});

r.on('clone', function() {
   var t = this, active = t.get('active'), 
    contacts = t.get('contacts.' + active),
    current = contacts.names[contacts.active],
    clone = t.get('names.' + current),
    someId = Math.random().toString(36).substring(7);

   t.set('names.' + someId, clone);
   t.unshift('contacts.' + active + '.names', someId);
   console.log(t.get('contacts'));
   console.log(t.get('names'));
});
预期的行为是,每当联系人中的名称数组或活动值发生更改时,文本框值和名称也应更新。目前,它克隆了当前联系人并附加到相应的姓名和联系人,但未在DOM中更新

我想做的是

在数据对象中,active属性是要从contacts对象键使用的active key。在示例中,如果它是1,则表示contacts.one,因此该值为

{ active : 0, names : ["Name1"] }
在上面的对象中,键名是该联系人的可用名称值,active是要使用的名称的名称索引。它将被计算为

active // one <global context>
names // data for each name value, <global context>
contacts[active] // contact.one
contacts[active].names // Available names for contact.one, so ["Name1", "Name2" etc..]
contacts[active].active // Index of name to be used in available names, in example its 0 
contacts[active].names[  contacts[active].active ] // Will be "Name1"
names["Name1"] // Name1 from above line

希望这是清楚的,请让我知道如何修复此问题,以便在更改活动时动态更改引用数据。

我恐怕完全无法理解此示例!我的大脑甚至无法开始处理行返回名称[contacts[active].names[contacts[active].active]]——作为起点,我想让代码变得更简单,这样就可以看到发生了什么。“你能更清楚地解释一下你想要实现什么吗?”RichHarris感谢你的回答。我已经添加了我正在尝试做的事情。请检查一下。我仍然不清楚预期的行为是什么,以及结果与预期的不同。你能描述一下你为重现问题所采取的确切步骤,以及应该发生的事情吗?这可能有助于简化您的数据结构-是否可以有多个联系人共享相同的姓名ID,例如Name1等?如果没有,将数据保存在联系人本身中,而不是间接引用它可能是有意义的。此外,我还避免重复使用属性名,如name/names和active,以便在不同的时间表示细微不同的内容。
active // one <global context>
names // data for each name value, <global context>
contacts[active] // contact.one
contacts[active].names // Available names for contact.one, so ["Name1", "Name2" etc..]
contacts[active].active // Index of name to be used in available names, in example its 0 
contacts[active].names[  contacts[active].active ] // Will be "Name1"
names["Name1"] // Name1 from above line
  Name1 : {
     name : "abc",
     active : {
        data : "Name1's data 1"
     }
  }