Я пытаюсь использовать KnockoutJS для создания интерактивной панели инструментов с привязками данных по различным аспектам свойства style
; а именно left
, top
, width
и height
. Например, я использую пользовательский интерфейс JQuery вместе с перетаскиваемыми и изменяемыми в пользовательском интерфейсе эффектами, чтобы пользователи могли перетаскивать панели на холсте и изменять их размеры по своему усмотрению. Без KnockoutJS я просто перебирал каждый div и крал эти свойства у элемента dom. Я уверен, что есть лучший способ использовать KnockoutJS, верно?
Чтобы объяснить мою проблему немного лучше, рассмотрим две панели рядом:
<div id='dashboard'>
<div id='panel1' class='ui-draggable ui-resizable' data-bind='?????'>
<!-- content goes here -->
</div>
<div id='panel2' class='ui-draggable ui-resizable' data-bind='?????'>
<!-- content goes here -->
</div>
<button data-bind='click: send'>Update</button>
</div>
Моя модель вида выглядит примерно так (примечание: для краткости псевдо-код):
var viewModel = {
panels: [
{ id: 'panel1', left: 0, top: 0, width: 50; height: 50 },
{ id: 'panel2', left: 50, top: 0, width: 50; height: 50 } ],
send: function() {
ko.utils.postJson( location.href , { panels: this.panels } );
}
};
ko.applyBindings( '#dashboard', viewModel );
Я бы хотел связать его таким образом, чтобы при изменении размера пользователем любого из элементов div (т.е. панелей) он затем обновлял базовый viewModel, используя встроенную привязку данных OnMouseUp
. Затем, когда пользователь нажимает кнопку «Обновить», я отправляю координаты на сервер.
Я думаю, что это может быть как-то связано с пользовательскими шаблонами, но даже там я столкнулся с некоторыми сложностями, которые я не мог понять при управлении событиями мыши на каждой панели.
<script type='text/html' id='panelTemplate'>
<div class='ui-draggable ui-resizable'
style='top: ${ top }; left: ${ left }; width: ${ width }px; height: ${ height }px;'>
<!-- content goes here -->
</div>
</script>
Идеи