mirror of
https://github.com/flynx/actions.js.git
synced 2025-10-29 10:20:09 +00:00
added action handler caching, off by default (experimental)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
7ce700872b
commit
39947ffd1f
134
actions.js
134
actions.js
@ -635,15 +635,132 @@ module.MetaActions = {
|
||||
},
|
||||
|
||||
|
||||
// Toggle handler cache...
|
||||
//
|
||||
// Toggle cache...
|
||||
// .toggleHandlerCache()
|
||||
//
|
||||
// Set caching on...
|
||||
// .toggleHandlerCache('on')
|
||||
// .toggleHandlerCache(true)
|
||||
//
|
||||
// Set caching off...
|
||||
// .toggleHandlerCache('off')
|
||||
// .toggleHandlerCache(false)
|
||||
//
|
||||
// Reset caching...
|
||||
// .toggleHandlerCache('!')
|
||||
//
|
||||
// Get current caching state...
|
||||
// .toggleHandlerCache('?')
|
||||
//
|
||||
// Get supported states...
|
||||
// .toggleHandlerCache('??')
|
||||
// -> ['on', 'off']
|
||||
//
|
||||
//
|
||||
// NOTE: setting the cache on may prevent calling of actions event
|
||||
// handlers of parent action-sets if they are added (via .on(..)
|
||||
// or .one(..), ...) AFTER the current object cloned it's cache.
|
||||
// to avoid this, care must be taken to reset the cache of
|
||||
// children objects, or not use caching for cases where action
|
||||
// event handlers can be added on the tree in runtime.
|
||||
//
|
||||
//
|
||||
// XXX EXPERIMENTAL...
|
||||
// XXX should we use the toggler object here???
|
||||
toggleHandlerCache: function(to){
|
||||
if(to == '?'){
|
||||
return this.__handler_cache ? 'on' : 'off'
|
||||
|
||||
} else if(to == '??'){
|
||||
return ['on', 'off']
|
||||
}
|
||||
|
||||
to = (to === true || to == 'on') ? true
|
||||
: (to === false || to == 'off') ? false
|
||||
: to == '!' ? !!this.__handler_cache
|
||||
: !this.__handler_cache
|
||||
|
||||
if(to){
|
||||
// no local cache -> copy from parent...
|
||||
if(this.__handler_cache
|
||||
&& !Object.hasOwnProperty(this, '__handler_cache')){
|
||||
var parent = this.__handler_cache
|
||||
var cache = this.__handler_cache = {}
|
||||
for(var a in parent){
|
||||
cache[a] = parent[a]
|
||||
}
|
||||
|
||||
// local cache only...
|
||||
} else {
|
||||
this.__handler_cache = this.__handler_cache || {}
|
||||
}
|
||||
|
||||
} else {
|
||||
// NOTE: we do not delete here so as to shadow the parent's
|
||||
// cache...
|
||||
this.__handler_cache = false
|
||||
}
|
||||
|
||||
return this
|
||||
},
|
||||
|
||||
// Rest handler cache...
|
||||
//
|
||||
// Reset the full cache...
|
||||
// .resetHandlerCache()
|
||||
// -> this
|
||||
//
|
||||
// Reset handler cache for action...
|
||||
// .resetHandlerCache(action)
|
||||
// -> this
|
||||
//
|
||||
// NOTE: when .toggleHandlerCache('?') is 'off' this has no effect.
|
||||
//
|
||||
// XXX EXPERIMENTAL...
|
||||
resetHandlerCache: function(name){
|
||||
var cache = this.__handler_cache
|
||||
if(cache){
|
||||
// full reset...
|
||||
if(name == null){
|
||||
this.__handler_cache = {}
|
||||
|
||||
// reset action...
|
||||
} else {
|
||||
// no local cache -> copy from parent...
|
||||
if(!Object.hasOwnProperty(this, '__handler_cache')){
|
||||
var parent = this.__handler_cache
|
||||
var cache = this.__handler_cache = {}
|
||||
for(var a in parent){
|
||||
cache[a] = parent[a]
|
||||
}
|
||||
}
|
||||
|
||||
delete cache[name]
|
||||
}
|
||||
}
|
||||
return this
|
||||
},
|
||||
|
||||
// Get action handlers from the inheritance chain...
|
||||
//
|
||||
// NOTE: this collects both the event handlers (in order of hierarchy,
|
||||
// then order of definition) and actions (in order of hierarchy)
|
||||
// NOTE: this is the correct order for 'pre' calling, but is the
|
||||
// reverse of how the 'post' handlers must be called.
|
||||
// NOTE: if .toggleHandlerCache('?') is on, this will serch once and
|
||||
// return the cached results on every subsequent call.
|
||||
//
|
||||
// For more docs on handler sequencing and definition see: .on(..)
|
||||
getHandlerList: function(name){
|
||||
// handler cache... XXX EXPERIMENTAL...
|
||||
var cache = this.__handler_cache
|
||||
if(cache && cache[name]){
|
||||
return cache[name]
|
||||
}
|
||||
|
||||
// get the handlers...
|
||||
var handlers = []
|
||||
var cur = this
|
||||
while(cur.__proto__ != null){
|
||||
@ -664,6 +781,12 @@ module.MetaActions = {
|
||||
|
||||
cur = cur.__proto__
|
||||
}
|
||||
|
||||
// handler cache... XXX EXPERIMENTAL...
|
||||
if(cache){
|
||||
cache[name] = handlers
|
||||
}
|
||||
|
||||
return handlers
|
||||
},
|
||||
|
||||
@ -760,6 +883,8 @@ module.MetaActions = {
|
||||
action = mode[0]
|
||||
mode = mode[1]
|
||||
|
||||
that.resetHandlerCache(action)
|
||||
|
||||
// keep the original handler for future use...
|
||||
var a_handler = handler
|
||||
|
||||
@ -828,6 +953,8 @@ module.MetaActions = {
|
||||
action = mode[0]
|
||||
mode = mode[1]
|
||||
|
||||
that.resetHandlerCache(action)
|
||||
|
||||
// get the handlers...
|
||||
var h = that._action_handlers[action] || []
|
||||
|
||||
@ -966,6 +1093,8 @@ module.MetaActions = {
|
||||
descriptors = descriptors || true
|
||||
all_attr_types = all_attr_types || false
|
||||
|
||||
this.resetHandlerCache()
|
||||
|
||||
if(all){
|
||||
var keys = []
|
||||
for(var k in from){
|
||||
@ -1044,6 +1173,8 @@ module.MetaActions = {
|
||||
descriptors = descriptors || true
|
||||
all_attr_types = all_attr_types || false
|
||||
|
||||
this.resetHandlerCache()
|
||||
|
||||
if(all){
|
||||
var keys = []
|
||||
for(var k in from){
|
||||
@ -1078,7 +1209,7 @@ module.MetaActions = {
|
||||
return this
|
||||
},
|
||||
|
||||
// This is similare in effect but different in mechanics to .inlineMixout(..)
|
||||
// This is similar in effect but different in mechanics to .inlineMixout(..)
|
||||
//
|
||||
// This will find and remove a mixin object from the inheritance chian.
|
||||
//
|
||||
@ -1089,6 +1220,7 @@ module.MetaActions = {
|
||||
// pop the mixin off the chain...
|
||||
if(o != null){
|
||||
o.__proto__ = o.__proto__.__proto__
|
||||
this.resetHandlerCache()
|
||||
}
|
||||
|
||||
return this
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ig-actions",
|
||||
"version": "1.4.0",
|
||||
"version": "1.5.0",
|
||||
"description": "",
|
||||
"main": "actions.js",
|
||||
"scripts": {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user