!(function() { /** * 顶部组件,提供输入框添加todo项目 * 布局: bi.horizontal_auto 实现水平居中. bi.left_right_vertical_adapt 实现标题是输入框的靠左靠右垂直居中 */ var ToDoListHeader = BI.inherit(BI.Widget, { props: { // 指定组件的className baseCls: "my-todolist-header" }, render: function() { var self = this, o = this.options; return { type: "bi.horizontal_auto", // 水平居中布局 items: [ { el: { type: "bi.left_right_vertical_adapt", // 左右垂直居中布局 width: 600, height: o.height, items: { left: [ { el: { type: "bi.label", cls: "my-todolist-title", text: "FineUI ToDoList", height: o.height } } ], right: [ { el: { type: "bi.editor", ref: function(_ref) { self.editor = _ref; }, allowBlank: true, cls: "my-todolist-header-editor", watermark: "添加ToDo", width: 300, height: 24, listeners: [ { // 监听bi.editor 组件的"EVENT_ENTER"事件(即敲回车),触发事件ToDoListHeader.EVENT_ADD事件并将输入框值置空 eventName: "EVENT_ENTER", action: function() { // 注意:在这里this指向的是bi.editor的实例.通过bi.editor的getValue()方法获取输入框输入值. self.fireEvent(ToDoListHeader.EVENT_ADD, this.getValue()); self.editor.setValue(""); } } ] } } ] } } } ] }; } }); ToDoListHeader.EVENT_ADD = "EVENT_ADD"; BI.shortcut("my.todolist.header", ToDoListHeader); })();!(function() { /** * todo项列表 * */ var List = BI.inherit(BI.Widget, { props: { // 指定组件的className baseCls: "my-todolist-list", text: "正在进行" }, render: function() { var self = this, o = this.options; return { type: "bi.vertical", items: [ { el: { type: "bi.vertical_adapt", height: 40, items: [ { type: "bi.label", cls: "my-todolist-list-text", textAlign: "left", text: o.text, width: 580 }, { type: "bi.center_adapt", cls: "my-todolist-list-count-container", width: 20, height: 20, items: [ { el: { type: "bi.label", ref: function(_ref) { self.count = _ref; }, text: "0" } } ] } ] } }, { // 用bi.vertical布局作为列表项的容器. type: "bi.vertical", vgap: 10, ref: function(_ref) { self.list = _ref; }, items: this._createItems(o.items) } ] }; }, _createItems: function(items) { var self = this; return BI.map(items, function(index, item) { return BI.extend(item, { type: "bi.multi_select_item", // 节点采用复选节点展示 selected: item.done, // 已完成的todo项置为选中状态 disabled: item.done, // 已完成的todo项置为灰化状态 listeners: [ { // 为每个todo项添加"EVENT_CHANGE"事件监听,触发组件自身"EVENT_CHANGE"事件 eventName: "EVENT_CHANGE", action: function(v) { self.fireEvent("EVENT_CHANGE", v); } } ] }); }); }, _setCount: function(count) { this.count.setText(count); }, populate: function(items) { this.list.populate(this._createItems(items)); this._setCount(items.length); } }); BI.shortcut("my.todolist.list", List); })();!(function() { /** * todolist 组件 */ var ToDoList = BI.inherit(BI.Widget, { props: { baseCls: "fine-to-do-list" }, // 生命周期函数,在组件创建前 beforeCreate: function() { // 初始化存储数据 this.list = localStorage.getItem("fine-todolist") ? JSON.parse(localStorage.getItem("fine-todolist")) : []; }, render: function() { var self = this, o = this.options; return { type: "bi.vtape", // vtape布局,顶部高度固定,下部分列表占满高度 items: [ { el: { type: "my.todolist.header", // 顶部组件 listeners: [ { // 监听组件的EVENT_ADD事件,新建todo项 eventName: "EVENT_ADD", action: function(v) { self.addToDo(v); } } ], height: 40 }, height: 40 }, { type: "bi.horizontal_auto", // 水平居中布局 cls: "my-todolist-background", // 添加className items: [ { el: { type: "my.todolist.list", // need todo项列表 ref: function(_ref) { self.todolist = _ref; }, items: this._getNeedTodoList(), text: "正在进行", listeners: [ { // 监听EVENT_CHANGE事件,完成某一项todo eventName: "EVENT_CHANGE", action: function(v) { self.finishTodo(v); } } ], width: 600 } }, { el: { type: "my.todolist.list", // 已经完成的todo项列表 text: "已经完成", items: this._getAlreadyDoneList(), ref: function(_ref) { self.donelist = _ref; }, width: 600 } } ] } ] }; }, _updateLocalStorage: function() { localStorage.setItem("fine-todolist", JSON.stringify(this.list)); }, _getNeedTodoList: function() { return BI.filter(this.list, function(index, item) { return !item.done; }); }, _getAlreadyDoneList: function() { return BI.filter(this.list, function(index, item) { return item.done; }); }, /** * 添加todo项 * @param text todo项的内容 */ addToDo: function(text) { this.list.push({ value: BI.UUID(), text: text, done: false }); this.todolist.populate(this._getNeedTodoList()); this._updateLocalStorage(); }, /** * 完成某一项todo * @param v todo项的value */ finishTodo: function(v) { BI.some(this.list, function(index, item) { if (item.value === v) { item.done = true; } }); this.todolist.populate(this._getNeedTodoList()); this.donelist.populate(this._getAlreadyDoneList()); this._updateLocalStorage(); } }); BI.shortcut("my.todolist", ToDoList); })(); !(function () { // 将todolist组件挂载到#wrapper上. BI.createWidget({ type: "my.todolist", element: "#wrapper" }); })();