mirror of
https://github.com/sstent/node.git
synced 2026-01-26 23:22:28 +00:00
110 lines
3.2 KiB
JavaScript
110 lines
3.2 KiB
JavaScript
var util = require('racer').util
|
|
, lookup = require('racer/lib/path').lookup
|
|
, merge = util.merge
|
|
, viewPath = require('./viewPath')
|
|
, ctxPath = viewPath.ctxPath
|
|
, pathFnArgs = viewPath.pathFnArgs
|
|
, setBoundFn = viewPath.setBoundFn;
|
|
|
|
exports.splitEvents = splitEvents;
|
|
exports.containsEvent = containsEvent;
|
|
exports.addDomEvent = util.isServer ? empty : addDomEvent;
|
|
|
|
function splitEvents(eventNames) {
|
|
var pairs = eventNames.replace(/\s/g, '').split(',')
|
|
, eventList = []
|
|
, pair, segments, name, eventName, delay, fn;
|
|
for (var i = pairs.length; i--;) {
|
|
pair = pairs[i];
|
|
segments = pair.split(':');
|
|
name = segments[0].split('/');
|
|
eventName = name[0];
|
|
delay = name[1];
|
|
fn = segments[1] || '';
|
|
eventList.push([eventName, delay, fn]);
|
|
}
|
|
return eventList;
|
|
}
|
|
|
|
function containsEvent(eventNames, expected) {
|
|
var eventList = splitEvents(eventNames)
|
|
, eventName;
|
|
for (var i = eventList.length; i--;) {
|
|
eventName = eventList[i][0];
|
|
if (eventName === expected) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function addDomEvent(events, attrs, eventNames, name, options) {
|
|
var eventList = splitEvents(eventNames)
|
|
, args;
|
|
if (name) {
|
|
if (~name.indexOf('(')) {
|
|
args = pathFnArgs(name);
|
|
if (!args.length) return;
|
|
|
|
events.push(function(ctx, modelEvents, dom, pathMap, view) {
|
|
var id = attrs._id || attrs.id
|
|
, paths = []
|
|
, arg, path, pathId, event, eventName, eventOptions, i, j;
|
|
options.setValue = function(model, value) {
|
|
return setBoundFn(view, ctx, model, name, value);
|
|
}
|
|
for (i = args.length; i--;) {
|
|
arg = args[i];
|
|
path = ctxPath(ctx, arg);
|
|
paths.push(path);
|
|
pathId = pathMap.id(path);
|
|
for (j = eventList.length; j--;) {
|
|
event = eventList[j];
|
|
eventName = event[0];
|
|
eventOptions = merge({pathId: pathId, delay: event[1]}, options);
|
|
dom.bind(eventName, id, eventOptions);
|
|
}
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
events.push(function(ctx, modelEvents, dom, pathMap) {
|
|
var id = attrs._id || attrs.id
|
|
, pathId = pathMap.id(ctxPath(ctx, name))
|
|
, event, eventName, eventOptions, i;
|
|
for (i = eventList.length; i--;) {
|
|
event = eventList[i];
|
|
eventName = event[0];
|
|
eventOptions = merge({pathId: pathId, delay: event[1]}, options);
|
|
dom.bind(eventName, id, eventOptions);
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
events.push(function(ctx, modelEvents, dom, pathMap, view) {
|
|
var id = attrs._id || attrs.id
|
|
, fnCtx = ctx.$fnCtx || view._appExports
|
|
, event, eventName, eventOptions, i, fnName;
|
|
for (i = eventList.length; i--;) {
|
|
event = eventList[i];
|
|
eventName = event[0];
|
|
eventOptions = fnListener(dom, fnCtx, event[1], event[2]);
|
|
merge(eventOptions, options);
|
|
dom.bind(eventName, id, eventOptions);
|
|
}
|
|
});
|
|
}
|
|
|
|
function fnListener(dom, fnCtx, delay, fnName) {
|
|
var listener = {
|
|
delay: delay
|
|
, fn: function() {
|
|
listener.fn = dom.fns[fnName] || fnCtx[fnName] || lookup(fnName, fnCtx);
|
|
listener.fn.apply(null, arguments);
|
|
}
|
|
};
|
|
return listener;
|
|
}
|
|
|
|
function empty() {}
|