【仅供内部供应商使用,不提供对外解答和培训】
【仅供内部供应商使用,不提供对外解答和培训】
开发者咨询一个可删除的列表怎么实现
实际上这是个自定义组件和button_group灵活使用的案例
很明显可以看出节点是由文字,复选框,删除按钮构成的,那么布局组件就可以考虑使用 htape布局, 删除按钮和复选框宽度固定,文字占满剩余空间
这里需要注意,因为继承了BasicButton,所以整个节点都会触发按钮被选中,因此点击删除按钮,也会导致节点被选中.因此要设置 stopPropagation: true 阻止事件冒泡
删除按钮被点击,如何通知到外部呢?这就应用到了fineui的事件机制,示例中对外发送了一个 EVENT_DELETE 事件. 当然如果Fix数据流使用的熟练的同学也可以通过context机制来处理,在此不多描述.
!(function () {
var Item = BI.inherit(BI.BasicButton, {
props: {
baseCls: "my-cls",
text: "",
height: 24
},
render: function () {
var self = this, o = this.options;
return {
type: "bi.htape",
items: [
{
type: "bi.label",
text: o.text,
textAlign: "left"
}, {
el: {
type: "bi.checkbox",
ref: function (_ref) {
self.checkbox = _ref;
},
height: 24
},
width: 24
}, {
el: {
type: "bi.icon_button",
cls: "delete-node-font",
stopPropagation: true,
handler: function () {
self.fireEvent("EVENT_DELETE", o.value);
}
},
width: 24
}
]
};
},
// 注意这个方法,button_group的items需要实现setSelected,isSelected,getValue等方法,因为此组件继承的是BasicButton,所以大部分方法父类都有实现,但是我们的列表需要点击节点区域后复选框也能随之勾选,因此需要重写一下setSelected方法
setSelected: function (b) {
Item.superclass.setSelected.apply(this, arguments);
this.checkbox.setSelected(b);
}
});
BI.shortcut("dec.demo.item", Item);
}());
采用button_group来控制多选逻辑.
List组件在包装items的时候为节点组件EVENT_DELETE事件监听,也就是上边讲的删除按钮事件
添加节点和删除节点都通过简单的populate来实现.
同时监听button_group的事件来保存节点选中状态
!(function () {
var List = BI.inherit(BI.Widget, {
props: {
baseCls: "dec-frame-body",
items: [{
text: "1",
value: 1
}, {
text: "2",
value: 2
}]
},
render: function () {
var self = this, o = this.options;
return {
type: "bi.vertical",
items: [
{
el: {
type: "bi.button",
text: "添加一个",
handler: function () {
self._addOne();
}
}
}, {
el: {
type: "bi.button_group",
ref: function (_ref) {
self.list = _ref;
},
layouts: [
{
type: "bi.vertical"
}
],
chooseType: BI.Selection.Single,
scrolly: true,
items: this._formatItems(o.items),
listeners: [
{
eventName: "EVENT_CHANGE",
action: function () {
self._handleSelect();
}
}
]
}
}
]
};
},
_addOne: function () {
this.options.items.push({
text: BI.UUID(),
value: BI.UUID()
});
this.populate(this.options.items);
},
_deleteOne: function (value) {
this.options.items = BI.filter(this.options.items, function (index, item) {
return item.value !== value;
});
this.populate(this.options.items);
},
_handleSelect: function () {
var selectedValues = this.getValue();
BI.each(this.options.items, function (index, item) {
item.selected = BI.contains(selectedValues, item.value);
});
},
_formatItems: function (items) {
var self = this;
return BI.map(items, function (index, item) {
return BI.extend({
type: "dec.demo.item",
listeners: [
{
eventName: "EVENT_DELETE",
action: function (value) {
self._deleteOne(value);
}
}
]
}, item);
});
},
getValue: function () {
return this.list.getValue();
},
populate: function (items) {
this.list.populate(this._formatItems(items));
}
});
BI.shortcut("dec.demo", List);
}());
效果示例