Я работаю над проектом в Javascript и столкнулся с проблемой, которую не понимаю. В основном я написал генератор карт, который генерирует карты из шума, этот бит в порядке и работает. Я хочу, чтобы конечный пользователь мог редактировать эту карту, размещая то, что я называю действиями (в основном формы, которые влияют на генерацию основного шума), и система их редактирования вызывает проблемы.
Я использую Mithril JS для обновления пользовательского интерфейса для редактирования свойств действий, и он в основном работает. Часть того, что мне нужно сделать, - это щелкнуть действие и выбрать его, это отобразится в пользовательском интерфейсе, чтобы вы могли его редактировать. Выбор действия работает, так же как отмена выбора или выбор другого действия, но если я затем удалю действие, оно больше не будет отображаться в пользовательском интерфейсе. Вот соответствующий фрагмент кода:
var editModeElements = {
actions: editedActions.actions,
selectedAction: [],
selectedPoint: null,
update: function() {
this.actions = editedActions;
this.clearSelection();
m.redraw();
},
deleteAction: function(action) {
for( var i = 0; i < this.actions.actions.length; i++)
{
if ( this.actions.actions[i] == action)
{
this.actions.actions.splice(i, 1); i--;
}
}
this.clearSelection();
unsavedEdits = true;
},
selectAction: function(action) {
this.selectedAction = new Array();
this.selectedPoint = null;
this.selectedAction.push(action);
m.redraw();
viewport.redraw();
},
clearSelection: function() {
this.selectedAction = new Array();
this.selectedPoint = null;
m.redraw();
viewport.redraw();
},
addAction: function(actionType) {
var action = createBlankAction(actionType);
this.actions.actions.push(action);
this.selectAction(action);
unsavedEdits = true;
},
oncreate: this.update,
view: function() {
return m(".action-dialog", [
m(".action-editor-buttons", [
m(".new-action", {onclick: function() {editModeElements.addAction(MASK_TYPE.CIRCLE)}}, "Circle"),
m(".new-action", {onclick: function() {editModeElements.addAction(MASK_TYPE.RECTANGLE)}}, "Rectangle"),
m(".new-action", {onclick: function() {editModeElements.addAction(MASK_TYPE.POLYGON)}}, "Polygon"),
m(".new-action", {onclick: function() {editModeElements.addAction(MASK_TYPE.LINE)}}, "Line"),
m(".new-action", {onclick: function() {editModeElements.addAction(MASK_TYPE.COMPLEX_CIRCLE)}}, "Complex Circle"),
m(".new-action", {onclick: function() {editModeElements.addAction(MASK_TYPE.COMPLEX_RECTANGLE)}}, "Complex Rectangle"),
m(".new-action", {onclick: function() {editModeElements.addAction(MASK_TYPE.COMPLEX_POLYGON)}}, "Complex Polygon"),
m(".new-action", {onclick: function() {editModeElements.addAction(MASK_TYPE.COMPLEX_LINE)}}, "Complex Line"),
]),
createActionEditorList(this.selectedAction, this),
]);
}
}
Надеюсь, этого достаточно, чтобы сказать мне, где я ошибаюсь. Проблема как-то связана с созданием нового массива, когда я вызываю clearSelection
. Если я удалю этот вызов из deleteSelection
, проблема исчезнет (но удаленный элемент останется выбранным в пользовательском интерфейсе, что нежелательно) или если я изменю часть в clearSelection
, чтобы вытолкнуть элемент вместо создания нового массива, он работает .
Однако, и это меня смущает, clearSelection
отлично работает (новый массив или метод pop), когда я использую его для отмены выбора, щелкая за пределами действия, и я также создаю новый массив в selectAction
что не вызывает проблем. Он перестает работать только после вызова deleteSelection
. Массив, из которого удаляется элемент в deleteSelection
, особо не связан с массивом selectedAction
, кроме действия, которое выбрано из него, поэтому я не вижу, что это может вызвать эти проблемы. Я также изменил его с filter (который создаст новый массив) на splice (который не работает), чтобы увидеть, помогло ли это, но без изменений. Действия по-прежнему выбираются после удаления и изменения цвета, их также можно успешно перетащить и сохранить, поэтому проблема, очевидно, связана с подключением к пользовательскому интерфейсу.
Я не думаю, что что-то еще за пределами этого фрагмента имеет значение он в значительной степени самодостаточен, функция createActionEditorList
в конце просто превращает действия в HTML элементы для пользовательского интерфейса, работает и довольно долго, поэтому я не включил ее.
Почему создание нового Массив сломал мой код?