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"
}
}