Ember 可编辑的递归嵌套组件
Ember editable recursive nested components
我目前正在尝试构建一个可以接受这样的模型的组件
"values": {
"value1": 234,
"valueOptions": {
"subOption1": 123,
"subOption2": 133,
"subOption3": 7432,
"valueOptions2": {
"subSubOption4": 821
}
}
}
每个对象递归地创建一个新组件。到目前为止,我已经创建了这个分支和节点组件,并且可以很好地接收和显示数据,但我遇到的问题是如何编辑和保存数据。每个组件都有不同的数据集,因为它被传递给自己的子对象。
Js 在这里乱转:https://ember-twiddle.com/b7f8fa6b4c4336d40982
树枝组件模板:
{{#each children as |child|}}
{{child.name}}
{{tree-node node=child.value}}
{{/each}}
{{#each items as |item|}}
<li>{{input value=item.key}} : {{input value=item.value}} <button {{action 'save' item}}>Save</button></li>
{{/each}}
树枝组件控制器:
export default Ember.Component.extend({
tagName: 'li',
classNames: ['branch'],
items: function() {
var node = this.get('node')
var keys = Object.keys(node);
return keys.filter(function(key) {
return node[key].constructor !== Object
}).map(function(key){
return { key: key, value: node[key]};
})
}.property('node'),
children : function() {
var node = this.get('node');
var children = [];
var keys = Object.keys(node);
var branchObjectKeys = keys.filter(function(key) {
return node[key].constructor === Object
})
branchObjectKeys.forEach(function(keys) {
children.push(keys)
})
children = children.map(function(key) {
return {name:key, value: node[key]}
})
return children
}.property('node'),
actions: {
save: function(item) {
console.log(item.key, item.value);
}
}
});
树节点组件:
{{tree-branch node=node}}
任何对我如何使这项工作有任何想法的人都会提供很大的帮助,谢谢!
使用:
save(item) {
let node = this.get('node');
if (!node || !node.hasOwnProperty(item.key)) {
return;
}
Ember.set(node, item.key, item.value);
}
我认为这是使用动作助手的最佳位置:
在你的控制器中定义动作:
//controller
actions: {
save: function() {
this.get('tree').save();
}
}
然后将其传递到您的组件中:
{{tree-branch node=tree save=(action 'save')}}
然后将相同的操作传递给 {{tree-branch}}
和 {{tree-node}}
并像这样触发它:
this.attrs.save();
我目前正在尝试构建一个可以接受这样的模型的组件
"values": {
"value1": 234,
"valueOptions": {
"subOption1": 123,
"subOption2": 133,
"subOption3": 7432,
"valueOptions2": {
"subSubOption4": 821
}
}
}
每个对象递归地创建一个新组件。到目前为止,我已经创建了这个分支和节点组件,并且可以很好地接收和显示数据,但我遇到的问题是如何编辑和保存数据。每个组件都有不同的数据集,因为它被传递给自己的子对象。
Js 在这里乱转:https://ember-twiddle.com/b7f8fa6b4c4336d40982
树枝组件模板:
{{#each children as |child|}}
{{child.name}}
{{tree-node node=child.value}}
{{/each}}
{{#each items as |item|}}
<li>{{input value=item.key}} : {{input value=item.value}} <button {{action 'save' item}}>Save</button></li>
{{/each}}
树枝组件控制器:
export default Ember.Component.extend({
tagName: 'li',
classNames: ['branch'],
items: function() {
var node = this.get('node')
var keys = Object.keys(node);
return keys.filter(function(key) {
return node[key].constructor !== Object
}).map(function(key){
return { key: key, value: node[key]};
})
}.property('node'),
children : function() {
var node = this.get('node');
var children = [];
var keys = Object.keys(node);
var branchObjectKeys = keys.filter(function(key) {
return node[key].constructor === Object
})
branchObjectKeys.forEach(function(keys) {
children.push(keys)
})
children = children.map(function(key) {
return {name:key, value: node[key]}
})
return children
}.property('node'),
actions: {
save: function(item) {
console.log(item.key, item.value);
}
}
});
树节点组件:
{{tree-branch node=node}}
任何对我如何使这项工作有任何想法的人都会提供很大的帮助,谢谢!
使用:
save(item) {
let node = this.get('node');
if (!node || !node.hasOwnProperty(item.key)) {
return;
}
Ember.set(node, item.key, item.value);
}
我认为这是使用动作助手的最佳位置:
在你的控制器中定义动作:
//controller
actions: {
save: function() {
this.get('tree').save();
}
}
然后将其传递到您的组件中:
{{tree-branch node=tree save=(action 'save')}}
然后将相同的操作传递给 {{tree-branch}}
和 {{tree-node}}
并像这样触发它:
this.attrs.save();