Я пытаюсь перемещать элементы из одного массива в другой и сортировать их по имени.
эта часть работает нормально, и кажется, что observable.refresh обновляет сами данные, но представление по-прежнему показывает старые данные, использование moveFromTo() перемещает элементы, но не обновляет их порядок в представлении.
moveFromToType2() покажет добавленные элементы, но не обновит удаленный.
В обоих случаях выполнение view.refresh() решает проблему, но я не думаю, что это предполагаемое поведение.
https://jsfiddle.net/y946xhvq/
<body>
<div id="multiselect"></div>
<script id="multiselectTemplate" type="text/x-jsrender">
<select id="leftSelect" multiple>
{^{for left}}
<option data-link="value{:#index}">{^{:name}}</option>
{{/for}}
</select>
<button id="rightButton"> > </button>
<button id="leftButton"> < </button>
<select id="rightSelect" multiple>
{^{for right}}
<option data-link="value{:#index}">{^{:name}}</option>
{{/for}}
</select>
</script>
<script>
var data = {
left: [{ "id": 0, "name": "Melendez Garner" }, { "id": 1, "name": "Mara Orr" }, { "id": 2, "name": "Bass Salazar" }, { "id": 3, "name": "Carol Freeman" }, { "id": 4, "name": "Selma Bradford" }, { "id": 5, "name": "Cotton Parrish" }, { "id": 6, "name": "Haley Campbell" }, { "id": 7, "name": "Ruth Wright" }, { "id": 8, "name": "Carmella Blake" }],
right: []
}
data.left.sort((a, b) => a.name.localeCompare(b.name));
var m = $.templates('#multiselectTemplate').link('#multiselect', data);
$('#multiselect').on('click', '#leftButton', function () {
//MOVE FROM RIGHT TO LEFT
var view = $.view(this);
var value = $('#rightSelect').val();
if (value === null) return;
//moveFromToType2(data.right, data.left, value);
moveFromTo(data.right, data.left, value);
//view.refresh();
}).on('click', '#rightButton', function () {
//MOVE FROM LEFT TO RIGHT
var view = $.view(this);
var value = $('#leftSelect').val();
if (value === null) return;
//moveFromToType2(data.left, data.right, value);
moveFromTo(data.left, data.right, value);
//view.refresh();
})
function moveFromToType2(from, to, index) {
if (from.length == 0) return;
if (index !== undefined) {
let selected = index.map(d => from[d]);
selected.forEach(d => {
let i = from.indexOf(d);
from.splice(i, 1);
});
$.observable(to).insert(selected);
to.sort((a, b) => a.name.localeCompare(b.name));
from.sort((a, b) => a.name.localeCompare(b.name));
}
}
function moveFromTo(from, to, index) {
if (from.length == 0) return;
if (index !== undefined) {
let selected = index.map(d => from[d]);
selected.forEach(d => {
let i = from.indexOf(d);
$.observable(from).remove(i);
});
$.observable(to).insert(selected);
to.sort((a, b) => a.name.localeCompare(b.name));
from.sort((a, b) => a.name.localeCompare(b.name));
$.observable(to).refresh(to);
$.observable(from).refresh(from);
}
}
</script>