У меня есть наблюдаемый массив, связанный с списком, который использует JQuery-ui для переупорядочения с перетаскиванием. Я также хочу, чтобы удалять элементы из наблюдаемого массива. Кажется, что все работает нормально, пока я не попытаюсь удалить элемент, который уже был переупорядочен.
Рассмотрим следующий код JsFiddle: http://jsfiddle.net/4mMfE/
Попробуйте перетащить "Медведя", чтобы стать третьим элементом в списке, а затем удалите его, он, похоже, не работает, но вы можете удалить другие.
Кто-нибудь знает, как заставить это работать, как ожидалось?
У меня такое чувство, что оно имеет какое-то отношение к тому, что наблюдаемый массив viewModel не синхронизируется с фактическим порядком элементов, отображаемых на странице.
.
Вы правы, что это связано с тем, что пользователь меняет порядок элементов в DOM, и он не обновляется в наблюдаемом массиве, поэтому, когда вы идете удалить элемент, его невозможно найти.
Вам нужна настраиваемая привязка, которая прослушивает события переупорядочения и соответственно обновляет модель. Удобно это уже существует для jQuery UI sortable: https://github.com/rniemeyer/knockout-sortable
Я думаю, что Knockout не знает, как обновлять пользовательский интерфейс. Он удаляет элементы из массива.
Просто измените функцию removeItem на это и убедитесь сами.
alert(self.items().slength);
self.items.remove(data);
alert(self.items().slength);