got really tired of doing node.getParent().remove(node). To remove a node, you now just do node.remove().

I realize that this doesn't follow the JavaScript pattern of
parent.remove(child), and that from an OO perspective, perhaps nodes
shouldn't have the ability to destroy themselves.  But, from a
practical standpoint, it's a heck of a lot more convenient to just use
.remove() when you want to remove something.
This commit is contained in:
ericdrowell 2012-09-26 12:50:08 -07:00
parent 900f02f912
commit 0a8f0ddb74
5 changed files with 85 additions and 89 deletions

74
dist/kinetic-core.js vendored
View File

@ -3,7 +3,7 @@
* http://www.kineticjs.com/
* Copyright 2012, Eric Rowell
* Licensed under the MIT or GPL Version 2 licenses.
* Date: Sep 25 2012
* Date: Sep 26 2012
*
* Copyright (C) 2011 - 2012 by Eric Rowell
*
@ -1384,6 +1384,40 @@ Kinetic.Node.prototype = {
}
}
},
/**
* remove child from container
* @name remove
* @methodOf Kinetic.Container.prototype
* @param {Node} child
*/
remove: function() {
var parent = this.getParent();
if(parent && this.index !== undefined && parent.children[this.index]._id == this._id) {
var stage = parent.getStage();
/*
* remove event listeners and references to the node
* from the ids and names hashes
*/
if(stage) {
stage._removeId(this.getId());
stage._removeName(this.getName(), this._id);
}
Kinetic.Global._removeTempNode(this);
parent.children.splice(this.index, 1);
parent._setChildrenIndices();
// remove children
while(this.children && this.children.length > 0) {
this.children[0].remove();
}
// do extra stuff if needed
if(this._remove !== undefined) {
this._remove();
}
}
},
/**
* get attrs
* @name getAttrs
@ -2444,7 +2478,7 @@ Kinetic.Container.prototype = {
*/
removeChildren: function() {
while(this.children.length > 0) {
this.remove(this.children[0]);
this.children[0].remove();
}
},
/**
@ -2484,42 +2518,6 @@ Kinetic.Container.prototype = {
// chainable
return this;
},
/**
* remove child from container
* @name remove
* @methodOf Kinetic.Container.prototype
* @param {Node} child
*/
remove: function(child) {
if(child && child.index !== undefined && this.children[child.index]._id == child._id) {
var stage = this.getStage();
/*
* remove event listeners and references to the node
* from the ids and names hashes
*/
if(stage) {
stage._removeId(child.getId());
stage._removeName(child.getName(), child._id);
}
Kinetic.Global._removeTempNode(child);
this.children.splice(child.index, 1);
this._setChildrenIndices();
// remove children
while(child.children && child.children.length > 0) {
child.remove(child.children[0]);
}
// do extra stuff if needed
if(child._remove !== undefined) {
child._remove();
}
}
// chainable
return this;
},
/**
* return an array of nodes that match the selector. Use '#' for id selections
* and '.' for name selections

File diff suppressed because one or more lines are too long

View File

@ -54,7 +54,7 @@ Kinetic.Container.prototype = {
*/
removeChildren: function() {
while(this.children.length > 0) {
this.remove(this.children[0]);
this.children[0].remove();
}
},
/**
@ -94,42 +94,6 @@ Kinetic.Container.prototype = {
// chainable
return this;
},
/**
* remove child from container
* @name remove
* @methodOf Kinetic.Container.prototype
* @param {Node} child
*/
remove: function(child) {
if(child && child.index !== undefined && this.children[child.index]._id == child._id) {
var stage = this.getStage();
/*
* remove event listeners and references to the node
* from the ids and names hashes
*/
if(stage) {
stage._removeId(child.getId());
stage._removeName(child.getName(), child._id);
}
Kinetic.Global._removeTempNode(child);
this.children.splice(child.index, 1);
this._setChildrenIndices();
// remove children
while(child.children && child.children.length > 0) {
child.remove(child.children[0]);
}
// do extra stuff if needed
if(child._remove !== undefined) {
child._remove();
}
}
// chainable
return this;
},
/**
* return an array of nodes that match the selector. Use '#' for id selections
* and '.' for name selections

View File

@ -161,6 +161,40 @@ Kinetic.Node.prototype = {
}
}
},
/**
* remove child from container
* @name remove
* @methodOf Kinetic.Container.prototype
* @param {Node} child
*/
remove: function() {
var parent = this.getParent();
if(parent && this.index !== undefined && parent.children[this.index]._id == this._id) {
var stage = parent.getStage();
/*
* remove event listeners and references to the node
* from the ids and names hashes
*/
if(stage) {
stage._removeId(this.getId());
stage._removeName(this.getName(), this._id);
}
Kinetic.Global._removeTempNode(this);
parent.children.splice(this.index, 1);
parent._setChildrenIndices();
// remove children
while(this.children && this.children.length > 0) {
this.children[0].remove();
}
// do extra stuff if needed
if(this._remove !== undefined) {
this._remove();
}
}
},
/**
* get attrs
* @name getAttrs

View File

@ -604,14 +604,14 @@ Test.prototype.tests = {
test(Kinetic.Global.shapes[circleColorKey]._id === circle._id, 'circle color key should be in shapes hash');
test(Kinetic.Global.shapes[rectColorKey]._id === rect._id, 'rect color key should be in shapes hash');
layer.remove(circle);
circle.remove();
test(stage.ids.myCircle === undefined, 'circle still in hash');
test(stage.names.myRect[0]._id === rect._id, 'rect not in names hash');
test(Kinetic.Global.shapes[circleColorKey] === undefined, 'circle color key should not be in shapes hash');
test(Kinetic.Global.shapes[rectColorKey]._id === rect._id, 'rect color key should be in shapes hash');
layer.remove(rect);
rect.remove();
test(stage.ids.myCircle === undefined, 'circle still in hash');
test(stage.names.myRect === undefined, 'rect still in hash');
@ -846,7 +846,7 @@ Test.prototype.tests = {
test(go.tempNodes[circle._id].attrs.id === 'myCircle', 'circle should be in temp nodes');
layer.remove(circle);
circle.remove();
test(go.tempNodes[circle._id] === undefined, 'circle shouldn\'t be in the temp nodes hash');
@ -877,7 +877,7 @@ Test.prototype.tests = {
test(stage.get('.myLayer')[0] !== undefined, 'layer should exist');
test(stage.get('.myCircle')[0] !== undefined, 'circle should exist');
stage.remove(layer);
layer.remove();
test(stage.children.length === 0, 'stage should have 0 children');
test(stage.get('.myLayer')[0] === undefined, 'layer should not exist');
@ -893,7 +893,7 @@ Test.prototype.tests = {
});
var layer = new Kinetic.Layer();
stage.add(layer);
stage.remove(layer);
layer.remove();
test(stage.children.length === 0, 'stage should have 0 children');
},
@ -926,8 +926,8 @@ Test.prototype.tests = {
test(layer.getChildren().length === 2, 'layer should have two children');
layer.remove(shape1);
layer.remove(shape1);
shape1.remove();
shape1.remove();
test(layer.getChildren().length === 1, 'layer should have two children');
@ -966,8 +966,8 @@ Test.prototype.tests = {
test(stage.getChildren().length === 2, 'stage should have two children');
stage.remove(layer1);
stage.remove(layer1);
layer1.remove();
layer1.remove();
test(stage.getChildren().length === 1, 'stage should have one child');
@ -3020,7 +3020,7 @@ Test.prototype.tests = {
test(layer.children.length === 1, 'layer should have 1 children');
layer.remove(circle);
circle.remove();
test(layer.children.length === 0, 'layer should have 0 children');
//test(layer.getChild('myCircle') === undefined, 'shape should be null');