Я бы, вероятно, сделал что-то подобное, учитывая, что если вставка не удалась, у вас должен быть какой-то способ восстановить данные. Я также использовал ES6, который отличается от вашего кода, но дает вам некоторую идею.
let parent
function removeItem (obj, itemToFind) {
// Loop the object
obj.find((e, index) => {
// If the id's match remove from the parent if it exists otherwise from the object as its at root level
if (e.id === itemToFind.id) {
if (parent) {
parent.children.splice(index, 1)
} else {
obj.splice(index, 1)
}
// break the loop once returned true. Change find to forEach to remove all instances with id if allowing multiples
return true
}
// recurse
else if (e.children && e.children.length > 0) {
parent = e
return removeItem(e.children, itemToFind)
}
})
}
// move item, return updated obj
function moveItem (itemToMove, obj, parentId) {
for (let i = 0; i < obj.length; i++) {
const value = obj[i]
const item = search(obj[i], parentId)
if (item) {
item.children.push(itemToMove) // pushed into children, but need to move not duplicate in
break
}
}
function search (obj, id) {
if (obj.id === id) {
return obj
}
for (let i = 0; i < obj.children.length; i++) {
const possibleResult = search(obj.children[i], id)
if (possibleResult) {
return possibleResult
}
}
}
return obj
};
removeItem(myObj, itemToMove)
moveItem(itemToMove, myObj, 3)
Вероятно, самый простой способ (который не требует отписки или другого материала) - объявить логическое значение и проверить это в начале обработчика:
bool dontRunHandler;
void Handler(object sender, EventArgs e) {
if (dontRunHandler) return;
// handler body...
}
Отключить с какой точки зрения? Если вы хотите удалить метод, находящийся в вашей области видимости, из списка делегатов в обработчике, вы можете просто сделать это.
object.Event -= new EventHandlerType(your_Method);
Это удалит этот метод из списка делегатов, и вы можете снова присоединить его позже с помощью
object.Event += new EventHandlerType(your_Method);
.