derby-templates
Advanced tools
Comparing version 0.7.3 to 0.8.0
@@ -6,5 +6,2 @@ exports.ContextMeta = ContextMeta; | ||
// TODO: | ||
// Implement removeItemContext | ||
function ContextMeta() { | ||
@@ -64,2 +61,3 @@ this.addBinding = noop; | ||
this._id = null; | ||
this._eventModels = null; | ||
} | ||
@@ -86,3 +84,20 @@ | ||
Context.prototype.removeNode = function(node) { | ||
this.meta.removeNode(node); | ||
var bindItemStart = node.$bindItemStart; | ||
if (bindItemStart) { | ||
this.meta.removeItemContext(bindItemStart.context); | ||
} | ||
var component = node.$component; | ||
if (component) { | ||
node.$component = null; | ||
if (!component.singleton) { | ||
component.destroy(); | ||
} | ||
} | ||
var destroyListeners = node.$destroyListeners; | ||
if (destroyListeners) { | ||
node.$destroyListeners = null; | ||
for (var i = 0, len = destroyListeners.length; i < len; i++) { | ||
destroyListeners[i](); | ||
} | ||
} | ||
}; | ||
@@ -89,0 +104,0 @@ |
@@ -28,2 +28,3 @@ var saddle = require('saddle'); | ||
exports.AsProperty = AsProperty; | ||
exports.AsPropertyComponent = AsPropertyComponent; | ||
exports.AsObject = AsObject; | ||
@@ -36,2 +37,5 @@ exports.AsObjectComponent = AsObjectComponent; | ||
exports.elementAddDestroyListener = elementAddDestroyListener; | ||
exports.elementRemoveDestroyListener = elementRemoveDestroyListener; | ||
// Add ::isUnbound to Template && Binding | ||
@@ -288,3 +292,3 @@ saddle.Template.prototype.isUnbound = function(context) { | ||
this._parse(); | ||
if (this.componentFactory) { | ||
if (this.componentFactory && !this.componentFactory.constructor.prototype.singleton) { | ||
var marker = new Marker(this.name); | ||
@@ -558,17 +562,11 @@ this.template.content.unshift(marker); | ||
ElementOn.prototype.emit = function(context, element) { | ||
var elementOn = this; | ||
if (this.name === 'create') { | ||
this.apply(context, element); | ||
} else if (this.name === 'destroy') { | ||
var destroyListeners = element.$destroyListeners || (element.$destroyListeners = []); | ||
destroyListeners.push(function elementOnDestroy() { | ||
elementOn.apply(context, element); | ||
}); | ||
} else { | ||
element.addEventListener(this.name, function elementOnListener(event) { | ||
return elementOn.apply(context, element, event); | ||
}, false); | ||
return; | ||
} | ||
var elementOn = this; | ||
var listener = function elementOnListener(event) { | ||
return elementOn.apply(context, element, event); | ||
}; | ||
context.controller.dom.on(this.name, element, listener, false); | ||
}; | ||
@@ -617,4 +615,19 @@ ElementOn.prototype.apply = function(context, element, event) { | ||
node[this.lastSegment] = target; | ||
this.addListeners(target, node, this.lastSegment); | ||
}; | ||
AsProperty.prototype.addListeners = function(target, object, key) { | ||
this.addDestroyListener(target, function asPropertyDestroy() { | ||
delete object[key]; | ||
}); | ||
}; | ||
AsProperty.prototype.addDestroyListener = elementAddDestroyListener; | ||
function AsPropertyComponent(segments) { | ||
AsProperty.call(this, segments); | ||
} | ||
AsPropertyComponent.prototype = Object.create(AsProperty.prototype); | ||
AsPropertyComponent.prototype.constructor = AsPropertyComponent; | ||
AsPropertyComponent.prototype.type = 'AsPropertyComponent'; | ||
AsPropertyComponent.prototype.addDestroyListener = componentAddDestroyListener; | ||
function AsObject(segments, keyExpression) { | ||
@@ -638,11 +651,2 @@ AsProperty.call(this, segments); | ||
}; | ||
AsObject.prototype.addListeners = function(target, object, key) { | ||
this.addDestroyListener(target, function asObjectDestroy() { | ||
delete object[key]; | ||
}); | ||
}; | ||
AsObject.prototype.addDestroyListener = function(target, listener) { | ||
var listeners = target.$destroyListeners || (target.$destroyListeners = []); | ||
listeners.push(listener); | ||
}; | ||
@@ -655,5 +659,3 @@ function AsObjectComponent(segments, keyExpression) { | ||
AsObjectComponent.prototype.type = 'AsObjectComponent'; | ||
AsObjectComponent.prototype.addDestroyListener = function(target, listener) { | ||
target.on('destroy', listener); | ||
}; | ||
AsObjectComponent.prototype.addDestroyListener = componentAddDestroyListener; | ||
@@ -691,4 +693,3 @@ function AsArray(segments) { | ||
this.addDestroyListener(target, function asArrayDestroy() { | ||
var index = array.indexOf(target); | ||
if (index !== -1) array.splice(index, 1); | ||
removeArrayItem(array, target); | ||
}); | ||
@@ -699,3 +700,2 @@ }; | ||
}; | ||
AsArray.prototype.addDestroyListener = AsObject.prototype.addDestroyListener; | ||
@@ -711,2 +711,28 @@ function AsArrayComponent(segments) { | ||
}; | ||
AsArrayComponent.prototype.addDestroyListener = AsObjectComponent.prototype.addDestroyListener; | ||
AsArrayComponent.prototype.addDestroyListener = componentAddDestroyListener; | ||
function elementAddDestroyListener(element, listener) { | ||
var destroyListeners = element.$destroyListeners; | ||
if (destroyListeners) { | ||
if (destroyListeners.indexOf(listener) === -1) { | ||
destroyListeners.push(listener); | ||
} | ||
} else { | ||
element.$destroyListeners = [listener]; | ||
} | ||
} | ||
function elementRemoveDestroyListener(element, listener) { | ||
var destroyListeners = element.$destroyListeners; | ||
if (destroyListeners) { | ||
removeArrayItem(destroyListeners, listener); | ||
} | ||
} | ||
function componentAddDestroyListener(target, listener) { | ||
target.on('destroy', listener); | ||
} | ||
function removeArrayItem(array, item) { | ||
var index = array.indexOf(item); | ||
if (index > -1) { | ||
array.splice(index, 1); | ||
} | ||
} |
{ | ||
"name": "derby-templates", | ||
"version": "0.7.3", | ||
"version": "0.8.0", | ||
"main": "index.js", | ||
@@ -5,0 +5,0 @@ "scripts": { |
71138
1825