From 1dfc749b6eb1c617268b150ebeecaadc3dd712ad Mon Sep 17 00:00:00 2001 From: harveyshao Date: Mon, 18 Oct 2021 14:36:54 +0800 Subject: [PATCH] add can.core.ItemCB --- frame.js | 10 ++++----- lib/base.js | 1 + lib/core.js | 8 +++++++ plugin/local/wiki/draw.js | 4 ++-- plugin/story/spide.js | 32 +++++++++++--------------- plugin/story/trend.js | 47 +++++++++++++++++---------------------- proto.js | 2 +- 7 files changed, 50 insertions(+), 54 deletions(-) diff --git a/frame.js b/frame.js index 5e78dc87..f08dbac4 100644 --- a/frame.js +++ b/frame.js @@ -9,9 +9,9 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb) }, can[item.name] = panel, panel._root = can, panel._trans = panel.onaction._trans - can.core.Item(panel.onaction, function(key, cb) { if (key.indexOf("on") == 0) { + can.core.ItemCB(panel.onaction, function(key, cb) { can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: panel, msg: msg}) }) - } }), panel.onaction._init(panel, item, item.list, next, panel._target) + }), panel.onaction._init(panel, item, item.list, next, panel._target) can.onmotion.float.auto(can, panel._output) panel.onkeypop._build(panel) @@ -145,9 +145,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return can.Update(event, can.Input(cmds, silent), cb, silent) }, can._inputs[item.name] = input, input.sup = can - can.core.Item(input.onaction, function(key, cb) { if (key.indexOf("on") == 0) { + can.core.ItemCB(input.onaction, function(key, cb) { input._target[key] = function(event) { cb(event, input) } - } }), can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]) + }), can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]) can.onappend.figure(input, item, input._target) }) @@ -306,7 +306,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, figure: function(can, meta, target, cb) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return } var input = meta.action||kit.MDB_KEY; input != "auto" && can.require(["/plugin/input/"+input+".js"], function(can) { - can.core.Item(can.onfigure[input], function(key, on) { if (key.indexOf("on") != 0) { return } + can.core.ItemCB(can.onfigure[input], function(key, on) { target[key] = function(event) { can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, [], function(sub) { sub.Conf(meta) sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()); diff --git a/lib/base.js b/lib/base.js index 988e4610..7bb87c5f 100644 --- a/lib/base.js +++ b/lib/base.js @@ -210,6 +210,7 @@ Volcanos("base", {help: "数据类型", isObject: function(arg) { return typeof arg == "object" }, isArray: function(arg) { return typeof arg == "object" && arg.length != undefined }, isFunction: function(arg) { return typeof arg == "function" }, + isCallback: function(key, value) { return key.indexOf("on") == 0 && can.base.isFunc(value) }, isFunc: function(cb) { return typeof cb == "function" }, isUndefined: function(arg) { return arg == undefined }, isNull: function(arg) { return arg == null }, diff --git a/lib/core.js b/lib/core.js index 96b9f263..54847a8c 100644 --- a/lib/core.js +++ b/lib/core.js @@ -181,5 +181,13 @@ Volcanos("core", {help: "数据结构", } return list }), + ItemCB: shy("迭代器", function(obj, cb) { var list = [] + for (var k in obj) { + if (k.indexOf("on") == 0 && typeof obj[k] == lang.FUNCTION) { + cb(k, obj[k]) + list.push(k) + } + } + }), }) diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index 869b513d..d40519de 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -14,8 +14,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.page.Modify(can, can.ui.content, msg.Result()||can.onexport.content(can)) can.page.Select(can, can.ui.content, "svg", function(svg) { can.svg = can.group = svg, can.onimport._group(can, svg).click() - can.core.Item(can.onimport, function(key, value) { - key.indexOf("on") == 0 && (svg[key] = function(event) { value(event, can) }) + can.core.ItemCB(can.onimport, function(key, cb) { + svg[key] = function(event) { cb(event, can) } }) can.page.Select(can, svg, "*", function(item, index) { item.tagName == "g"? can.onimport._group(can, item): can.onimport._block(can, item) diff --git a/plugin/story/spide.js b/plugin/story/spide.js index 390a0bb9..a6a64cdd 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -1,6 +1,5 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can) - can.base.isFunc(cb) && cb(msg) + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) if (msg.Option("branch")) { return can.onappend.table(can, msg) } can.dir_root = msg.Option("dir_root") @@ -9,7 +8,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can._tree[""].name = can.dir_root.split("/").pop() can.size = 30, can.margin = 30 - can.onappend.plugin(can, {index: "web.wiki.draw", style: "output"}, function(sub) { + can.onappend.plugin(can, {index: "web.wiki.draw", style: chat.OUTPUT}, function(sub) { sub.run = function(event, cmds, cb) { sub.Action("go", "run") can.base.isFunc(cb) && cb(sub.request()) @@ -39,10 +38,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) return node }, - _height: function(can, tree) { - if (!tree) { return 0 } - if (tree.hide) { return tree.height = 1 } + _height: function(can, tree) { if (!tree) { return 0 } if (tree.list.length == 0) { return tree.height = 1 } + if (tree.hide) { return tree.height = 1 } var height = 0; can.core.List(tree.list, function(item) { height += can.onimport._height(can, item) @@ -59,9 +57,9 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向", can.onmotion.clear(can, can.draw.svg) can.onimport._height(can, can._tree[""]) - can.draw.svg.Val("height", can._tree[""].height*can.size+2*can.margin) + can.draw.svg.Val(chat.HEIGHT, can._tree[""].height*can.size+2*can.margin) can.width = 0, can.onaction._draw(can, can._tree[""], can.margin, can.margin) - can.draw.svg.Val("width", can.width+can.margin) + can.draw.svg.Val(chat.WIDTH, can.width+can.margin) }, "纵向": function(event, can) { can.onmotion.clear(can, can.draw.svg) @@ -81,10 +79,8 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向", tree.width = tree.view.Val("textLength") if (x+tree.width > can.width) { can.width = x+tree.width } - can.core.Item(can.ondetail, function(key, value) { - if (key.indexOf("on") == 0 && can.base.isFunc(value)) { - tree.view[key] = function(event) { value(event, can, tree) } - } + can.core.ItemCB(can.ondetail, function(key, cb) { + tree.view[key] = function(event) { cb(event, can, tree) } }) if (tree.hide) { return } @@ -140,21 +136,19 @@ Volcanos("ondetail", {help: "用户交互", list: [], }, plugin: function(event, can, args) { - can.onappend.plugin(can, {type: "float", index: "web.code.inner", args: args, _action: ["关闭"]}, function(sub) { + can.onappend.plugin(can, {type: chat.FLOAT, index: "web.code.inner", args: args, _action: [cli.CLOSE]}, function(sub) { sub.run = function(event, cmds, cb) { can.run(event, can.misc.Concat([ctx.ACTION, "inner"], cmds), function(msg) { - msg.Option(ice.MSG_ACTION, "close") + msg.Option(ice.MSG_ACTION, cli.CLOSE) can.search(event, ["Action.onexport.size"], function(msg, left, top, width, height) { left = left||0 var top = 120, margin = 20; if (can.user.isMobile) { margin = 0 if (can.user.isLandscape) { - sub.Conf("height", window.innerHeight+200) - top = 24 + sub.Conf(chat.HEIGHT, window.innerHeight+200), top = 24 } else { - sub.Conf("height", window.innerHeight+140) - top = 48 + sub.Conf(chat.HEIGHT, window.innerHeight+140), top = 48 } } else { - sub.Conf("height", height+120) + sub.Conf(chat.HEIGHT, height+120) } var layout = {position: "fixed", left: left+margin, top: top} diff --git a/plugin/story/trend.js b/plugin/story/trend.js index ce3bcc47..d933ab50 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -1,13 +1,12 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can) - can.base.isFunc(cb) && cb(msg) + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) if (msg.Option("branch")) { return can.onappend.table(can, msg) } can.msg = msg, can.data = msg.Table(), can.onimport._sum(can) - can.Action("height", msg.Option("height")||can.user.mod.isCmd? "max": can.user.isMobile&&can.user.isLandscape? "200": "400") + can.Action(chat.HEIGHT, msg.Option(chat.HEIGHT)||can.user.mod.isCmd? "max": can.user.isMobile&&can.user.isLandscape? "200": "400") can.Action("speed", parseInt(msg.Option("speed")||"100")) - can.onappend.plugin(can, {index: "web.wiki.draw", style: "output"}, function(sub) { + can.onappend.plugin(can, {index: "web.wiki.draw", style: chat.OUTPUT}, function(sub) { sub.run = function(event, cmds, cb) { sub.Action("go", "run") can.base.isFunc(cb) && cb(sub.request()) @@ -49,17 +48,16 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 can.onmotion.toggle(can, can.draw._action) can.onmotion.toggle(can, can.draw._status) }, - "趋势图": function(event, can) { var height = can.Action("height") - if (height == "max") { height = can.Conf("height") - chat.CMD_MARGIN } + "趋势图": function(event, can) { var height = can.Action(chat.HEIGHT) + if (height == "max") { height = can.Conf(chat.HEIGHT) - chat.CMD_MARGIN } height = parseInt(height) - var space = 10 - var width = parseInt(can.Conf("width")) + var space = 10, width = parseInt(can.Conf(chat.WIDTH)) var step = parseInt((width-2*space) / can.list.length) can.onmotion.clear(can, can.draw.svg) - can.draw.svg.Val("height", height) - can.draw.svg.Val("width", width) + can.draw.svg.Val(chat.HEIGHT, height) + can.draw.svg.Val(chat.WIDTH, width) function scale(y) { return (y - can.min)/(can.max - can.min)*(height-2*space) } function order(index, x, y) { return {x: space+step*index+x, y: height-space-scale(y)} } @@ -69,7 +67,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 shape: "line", point: [ order(index, step/2, line.min), order(index, step/2, line.max), ], style: { - "stroke-width": 1, "stroke": line.begin < line.close? "white": "black", + "stroke-width": 1, "stroke": line.begin < line.close? chat.WHITE: chat.BLACK, }, }) @@ -77,15 +75,13 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 shape: "rect", point: [ order(index, step/4, line.close), order(index, step/4*3, line.begin), ], style: can.base.Copy({"stroke-width": 1, "rx": 0, "ry": 0}, line.begin < line.close? { - "stroke": "white", "fill": "white", + "stroke": chat.WHITE, "fill": chat.WHITE, }: { - "stroke": "black", "fill": "black", + "stroke": chat.BLACK, "fill": chat.BLACK, }), _init: function(view) { - can.core.Item(can.ondetail, function(key, value) { - if (key.indexOf("on") == 0 && can.base.isFunc(value)) { - view[key] = function(event) { value(event, can, line) } - } + can.core.ItemCB(can.ondetail, function(key, cb) { + view[key] = function(event) { cb(event, can, line) } }) }, }) @@ -106,14 +102,13 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 }) }) - var space = 10 - var width = parseInt(can.Conf("width")) - var height = parseInt(can.Action("height")) + var height = parseInt(can.Action(chat.HEIGHT)) + var space = 10, width = parseInt(can.Conf(chat.WIDTH)) var step = parseInt((width-2*space) / can.list.length) can.onmotion.clear(can, can.draw.svg) - can.draw.svg.Val("height", height) - can.draw.svg.Val("width", width) + can.draw.svg.Val(chat.HEIGHT, height) + can.draw.svg.Val(chat.WIDTH, width) function scale(key, y) { return (y - min[key])/(max[key] - min[key])*(height-2*space) } function order(index, key, x, y) { return {x: space+step*index+x, y: space+scale(key, y)} } @@ -126,13 +121,11 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图 shape: "rect", point: [ order(index, key, width*which+2, 0), order(index, key, width*which+2+width, y), ], style: { - "stroke-width": 1, "stroke": "white", "fill": "white", "rx": 0, "ry": 0, + "stroke-width": 1, "stroke": chat.WHITE, "fill": chat.WHITE, "rx": 0, "ry": 0, }, _init: function(view) { - can.core.Item(can.ondetail, function(key, value) { - if (key.indexOf("on") == 0 && can.base.isFunc(value)) { - view[key] = function(event) { value(event, can, line) } - } + can.core.ItemCB(can.ondetail, function(key, cb) { + view[key] = function(event) { cb(event, can, line) } }) }, }) diff --git a/proto.js b/proto.js index 557a7440..498c9806 100644 --- a/proto.js +++ b/proto.js @@ -96,7 +96,7 @@ const wiki = { FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse", } const chat = { - LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", + LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", STORY: "story", CARTE: "carte", INPUT: "input", FLOAT: "float", HEAD: "head", AUTO: "auto", LEFT: "left", MAIN: "main", FOOT: "foot", SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top",