anima-widget
Advanced tools
Comparing version 1.0.0 to 1.1.0
@@ -1,35 +0,33 @@ | ||
# 历史记录 | ||
# History | ||
--- | ||
## 1.1.1 | ||
## 1.0.0 | ||
`tag:fixed` #55 修复 destroy 时会把之前绑定的事件清除的问题 | ||
`new` It is the first version of widget. | ||
`tag:improved` #54 标准化 DAParser 的写法 | ||
`tag:improved` 升级依赖 arale/base 到 1.1.1 | ||
## 1.1.0 | ||
## 1.1.0 [milestone](https://github.com/aralejs/widget/issues/37) | ||
### events | ||
`tag:fixed` [#25](https://github.com/aralejs/widget/issues/25) destroy 的 bug | ||
* 去除 once 功能 | ||
`tag:changed` [#47](https://github.com/aralejs/widget/issues/47) 不再使用 `this.template` 和 `this.model` | ||
`tag:changed` [#36](https://github.com/aralejs/widget/issues/36) 当属性值为空字符串时的处理 | ||
### class | ||
`tag:new` [#39](https://github.com/aralejs/widget/issues/39) 彻底隔离样式冲突的 widget 方案 | ||
* 使用$.mix 和 $.isFunction | ||
`tag:new` [#33](https://github.com/aralejs/widget/issues/33) handlebars runtime | ||
### base | ||
`tag:new` [#26](https://github.com/aralejs/widget/issues/26) 支持 data-widget-role | ||
* 去除 aspect | ||
`tag:improved` [#14](https://github.com/aralejs/widget/issues/14) delegateEvents 增强 | ||
`tag:improved` [#38](https://github.com/aralejs/widget/issues/38) 销毁 widget 创建的 element | ||
### attribute | ||
`tag:improved` [#40](https://github.com/aralejs/widget/issues/40) 简化 initAttrs 参数 | ||
* 工具方法isFunciton,isArray,isPlainObject 替换 | ||
* 去掉 setter,getter 方法 | ||
## 1.0.3 | ||
### widget | ||
`tag:improved` [28](https://github.com/aralejs/widget/issues/28) Templatable 增加 cache,编译过后的模板不再编译,提高创建实例对象的性能。 | ||
* 去掉 events,delegate 功能 |
@@ -0,2 +1,3 @@ | ||
var Widget = require('./src/widget'); | ||
module.exports = require('./src/widget'); | ||
module.exports = Widget; |
{ | ||
"name": "anima-widget", | ||
"version": "1.0.0", | ||
"description": "Widget 是 UI 组件的基础类,约定了组件的基本生命周期,实现了一些通用功能。基于 Widget 可以构建出任何你想要的 Web 界面组件。", | ||
"keywords": [ | ||
"infrastructure", | ||
"ui" | ||
], | ||
"homepage": "http://animajs.org/widget/", | ||
"author": "贯高 <sakura9515@gmail.com>", | ||
"version": "1.1.0", | ||
"description": "", | ||
"keywords": [], | ||
"homepage": "http://gitlab.alibaba-inc.com/animajs/widget", | ||
"author": "", | ||
"maintainers": [ | ||
"玉伯 <lifesinger@gmail.com>", | ||
"贯高 <sakura9515@gmail.com>", | ||
"云谦 <sorrycc@gmail.com>", | ||
"完颜 <SMbey0nd@163.com>" | ||
"dxq613" | ||
], | ||
"repository": { | ||
"type": "git", | ||
"url": "https://github.com/animajs/widget.git" | ||
"url": "git@gitlab.alibaba-inc.com:animajs/widget.git" | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/animajs/widget/issues" | ||
"url": "http://gitlab.alibaba-inc.com/animajs/widget/issues" | ||
}, | ||
"spm": {}, | ||
"licenses": "MIT", | ||
"spm": { | ||
"engines": { | ||
"seajs": "2.2.1" | ||
}, | ||
"tests": "tests/*.js" | ||
}, | ||
"main": "index.js", | ||
"dependencies": { | ||
"anima-yocto": "1.0.1", | ||
"anima-base": "1.0.0" | ||
"anima-yocto": "1.0.1" | ||
}, | ||
"devDependencies": { | ||
"spm-expect": "0.3.1", | ||
"spm-expect.js": "0.3.1", | ||
"spm-sinon": "1.6.0", | ||
@@ -33,0 +32,0 @@ "spm-webpack": "~1.0.0" |
@@ -47,3 +47,2 @@ # Widget | ||
.initProps() // 提供给用户处理属性 | ||
.delegateEvents() // 事件代理,将事件代理到 `this.element` 上 | ||
.setup() // 实例化最后一步,用户自定义操作,提供给子类继承。 | ||
@@ -101,57 +100,17 @@ ``` | ||
### 事件代理 | ||
### 事件 | ||
事件代理是 Widget 非常好用的特性,将所有的事件都代理到 `this.element` 上。这样可以使得对应的 | ||
DOM 内容有修改时,无需重新绑定,在 destroy 的时候也会销毁这些事件。 | ||
控件的自定义事件可以直接通过on方法绑定到控件上, 也可以直接将所有的事件都代理到 `this.element` 上 | ||
`widget.delegateEvents()` 会在实例初始化时自动调用,这时会从 `this.events` 中取得声明的代理事件,比如 | ||
```js | ||
var MyWidget = Widget.extend({ | ||
events: { | ||
"dblclick": "open", | ||
"click .icon.doc": "select", | ||
"mouseover .date": "showTooltip" | ||
}, | ||
open: function() { | ||
... | ||
}, | ||
select: function() { | ||
... | ||
}, | ||
... | ||
}); | ||
``` | ||
var widget = new AWidget(); | ||
`events` 中每一项的格式是:`"event selector": "callback"`,当省略 `selector` | ||
时,默认会将事件绑定到 `this.element` 上。`callback` 可以是字符串,表示当前实例上的方法名; | ||
也可以直接传入函数。 | ||
widget.on('show',function(){ | ||
`events` 还可以是方法,返回一个 events hash 对象即可。比如 | ||
}); | ||
```js | ||
var MyWidget = Widget.extend({ | ||
events: function() { | ||
var hash = { | ||
"click": "open", | ||
"click .close": "close" | ||
}; | ||
widget.element.on('click',function(){ | ||
return hash; | ||
}, | ||
... | ||
}); | ||
``` | ||
}); | ||
`events` 中,还支持 `{{name}}` 表达式,比如上面的代码,可以简化为: | ||
```js | ||
var MyWidget = Widget.extend({ | ||
events: { | ||
"click": "open", | ||
"click .close": "close", | ||
"mouseover {{attrs.panels}}": "hover" | ||
}, | ||
... | ||
}); | ||
``` | ||
@@ -158,0 +117,0 @@ |
@@ -7,3 +7,3 @@ // Widget | ||
var Base = require('anima-base'); | ||
var Base = require('./base'); | ||
var $ = require('anima-yocto'); | ||
@@ -21,3 +21,3 @@ | ||
// config 中的这些键值会直接添加到实例上,转换成 properties | ||
propsInAttrs: ['initElement', 'element', 'events'], | ||
propsInAttrs: ['initElement', 'element'], | ||
@@ -27,10 +27,2 @@ // 与 widget 关联的 DOM 元素 | ||
// 事件代理,格式为: | ||
// { | ||
// 'mousedown .title': 'edit', | ||
// 'click {{attrs.saveButton}}': 'save' | ||
// 'click .open': function(ev) { ... } | ||
// } | ||
events: null, | ||
// 属性列表 | ||
@@ -46,5 +38,2 @@ attrs: { | ||
// 默认数据模型 | ||
model: null, | ||
// 组件的默认父节点 | ||
@@ -66,5 +55,2 @@ parentNode: document.body | ||
// 初始化 events | ||
this.delegateEvents(); | ||
// 子类自定义的初始化 | ||
@@ -102,109 +88,2 @@ this.setup(); | ||
// 注册事件代理 | ||
delegateEvents: function(element, events, handler) { | ||
var argus = trimRightUndefine(Array.prototype.slice.call(arguments)); | ||
// widget.delegateEvents() | ||
if (argus.length === 0) { | ||
events = getEvents(this); | ||
element = this.element; | ||
} | ||
// widget.delegateEvents({ | ||
// 'click p': 'fn1', | ||
// 'click li': 'fn2' | ||
// }) | ||
else if (argus.length === 1) { | ||
events = element; | ||
element = this.element; | ||
} | ||
// widget.delegateEvents('click p', function(ev) { ... }) | ||
else if (argus.length === 2) { | ||
handler = events; | ||
events = element; | ||
element = this.element; | ||
} | ||
// widget.delegateEvents(element, 'click p', function(ev) { ... }) | ||
else { | ||
element || (element = this.element); | ||
this._delegateElements || (this._delegateElements = []); | ||
this._delegateElements.push($(element)); | ||
} | ||
// 'click p' => {'click p': handler} | ||
if (isString(events) && $.isFunction(handler)) { | ||
var o = {}; | ||
o[events] = handler; | ||
events = o; | ||
} | ||
// key 为 'event selector' | ||
for (var key in events) { | ||
if (!events.hasOwnProperty(key)) continue; | ||
var args = parseEventKey(key, this); | ||
var eventType = args.type; | ||
var selector = args.selector; | ||
(function(handler, widget) { | ||
var callback = function(ev) { | ||
if ($.isFunction(handler)) { | ||
handler.call(widget, ev); | ||
} else { | ||
widget[handler](ev); | ||
} | ||
} | ||
// delegate | ||
$(element).on(eventType, selector, callback); | ||
})(events[key], this); | ||
} | ||
return this; | ||
}, | ||
// 卸载事件代理 | ||
undelegateEvents: function(element, eventKey) { | ||
var argus = trimRightUndefine(Array.prototype.slice.call(arguments)); | ||
if (!eventKey) { | ||
eventKey = element; | ||
element = null; | ||
} | ||
// 卸载所有 | ||
// .undelegateEvents() | ||
if (argus.length === 0) { | ||
var type = DELEGATE_EVENT_NS + this.cid; | ||
this.element && this.element.off(type); | ||
// 卸载所有外部传入的 element | ||
if (this._delegateElements) { | ||
for (var de in this._delegateElements) { | ||
if (!this._delegateElements.hasOwnProperty(de)) continue; | ||
this._delegateElements[de].off(type); | ||
} | ||
} | ||
} else { | ||
var args = parseEventKey(eventKey, this); | ||
// 卸载 this.element | ||
// .undelegateEvents(events) | ||
if (!element) { | ||
this.element && this.element.off(args.type, args.selector); | ||
} | ||
// 卸载外部 element | ||
// .undelegateEvents(element, events) | ||
else { | ||
$(element).off(args.type, args.selector); | ||
} | ||
} | ||
return this; | ||
}, | ||
// 提供给子类覆盖的初始化方法 | ||
@@ -295,3 +174,3 @@ setup: function() { | ||
destroy: function() { | ||
this.undelegateEvents() | ||
//this.undelegateEvents() | ||
delete cachedInstances[this.cid]; | ||
@@ -341,57 +220,2 @@ | ||
var EVENT_KEY_SPLITTER = /^(\S+)\s*(.*)$/; | ||
var EXPRESSION_FLAG = /{{([^}]+)}}/g; | ||
var INVALID_SELECTOR = 'INVALID_SELECTOR'; | ||
function getEvents(widget) { | ||
if ($.isFunction(widget.events)) { | ||
widget.events = widget.events(); | ||
} | ||
return widget.events; | ||
} | ||
function parseEventKey(eventKey, widget) { | ||
var match = eventKey.match(EVENT_KEY_SPLITTER) | ||
var eventType = match[1] + DELEGATE_EVENT_NS + widget.cid | ||
// 当没有 selector 时,需要设置为 undefined,以使得 zepto 能正确转换为 bind | ||
var selector = match[2] || undefined | ||
if (selector && selector.indexOf('{{') > -1) { | ||
selector = parseExpressionInEventKey(selector, widget) | ||
} | ||
return { | ||
type: eventType, | ||
selector: selector | ||
} | ||
} | ||
// 解析 eventKey 中的 {{xx}}, {{yy}} | ||
function parseExpressionInEventKey(selector, widget) { | ||
return selector.replace(EXPRESSION_FLAG, function(m, name) { | ||
var parts = name.split('.') | ||
var point = widget, part | ||
while (part = parts.shift()) { | ||
if (point === widget.attrs) { | ||
point = widget.get(part) | ||
} else { | ||
point = point[part] | ||
} | ||
} | ||
// 已经是 className,比如来自 dataset 的 | ||
if (isString(point)) { | ||
return point | ||
} | ||
// 不能识别的,返回无效标识 | ||
return INVALID_SELECTOR | ||
}) | ||
} | ||
// 对于 attrs 的 value 来说,以下值都认为是空值: null, undefined | ||
@@ -401,12 +225,1 @@ function isEmptyAttrValue(o) { | ||
} | ||
function trimRightUndefine(argus) { | ||
for (var i = argus.length - 1; i >= 0; i--) { | ||
if (argus[i] === undefined) { | ||
argus.pop(); | ||
} else { | ||
break; | ||
} | ||
} | ||
return argus; | ||
} |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No contributors or author data
MaintenancePackage does not specify a list of contributors or an author in package.json.
Found 1 instance in 1 package
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
Found 1 instance in 1 package
1
24931
12
603
3
119
1
- Removedanima-base@1.0.0
- Removedanima-base@1.0.0(transitive)
- Removedanima-class@1.0.0(transitive)
- Removedanima-events@1.0.0(transitive)