UIkit - 如何使用可排序组件获取订单?
UIkit - how to get order with the sortable component?
我实施了 UIkit sortable component 并添加了一个 stop
事件。但是如果一个项目被拖动,我无法弄清楚如何计算新订单。到目前为止,我唯一能想到的就是给每个项目一个 id,然后根据该 id 进行计算,但这似乎不是正确的方法
有一种非常简单的方法可以实现这一点。 element 存储 originalEvent ,您还可以在其中找到 explicitOriginalTarget - 我们移动的元素。由于它被包裹在 ul 里面的 li 中,我上升到它的 parentNode (li),所以我处于我需要的元素级别,然后将它转换为 jQuery 对象(你不必,我做了只是因为它很快),然后你就可以得到它的索引。所有这些值都可以通过 console.log(e);
访问
此解决方案的唯一问题是性能,它可以工作,但是当您过于频繁地移动元素时,它可能会显示 0 而不是正确的索引值
编辑: 我意识到你可能在询问整组项目及其顺序,而不仅仅是当前移动项目的索引,所以我还添加了控制台日志记录这也是
示例如下:
var indexes = new Array();
$(document).on('moved', '.uk-sortable', function(e) {
var currentLi = e.originalEvent.explicitOriginalTarget.parentNode;
indexes = [];
$(this).find('li').each(function() {
indexes.push($(this).data("index"));
});
alert("New position: " + $(currentLi).index());
console.log(indexes);
});
$('.uk-sortable').find('li').each(function(i) {
$(this).data("index", i);
indexes.push(i);
});
console.log(indexes);
<!-- UIkit CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.35/css/uikit.min.css" />
<!-- UIkit JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.35/js/uikit.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.35/js/uikit-icons.min.js"></script>
<ul class="uk-grid-small uk-child-width-1-4 uk-text-center" uk-sortable="handle: .uk-card" uk-grid>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 1</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 2</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 3</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 4</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 5</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 6</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 7</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 8</div>
</li>
</ul>
我发现的最简单的方法是获取所有元素的列表并执行映射操作,returns 一组独特且可识别的属性(例如,可排序元素的 ID。
moved 事件有一个 detail 属性,它是一个包含 UIKitComponent 和目标元素的数组;您可以从 UIKitComponent 中获取 items。
const new_order = event.detail[0].items.map(el => el.id);
//["id-1", "id-2", "id-3"];
你可以在事后得到索引,至少混乱的 DOM 方面已经排序了。
我在搜索其他内容时遇到了这个问题,并且碰巧知道您正在寻找的答案。您不需要 jQuery 或其他任何东西,只需要 UIkit。
<ul id="sortable-element" uk-sortable>
<li class="uk-sortable-item" data-id="1">Content</li>
<li class="uk-sortable-item" data-id="2">Content</li>
<li class="uk-sortable-item" data-id="3">Content</li>
<li class="uk-sortable-item" data-id="4">Content</li>
<li class="uk-sortable-item" data-id="5">Content</li>
</ul>
let sortable = UIkit.sortable("#sortable-element");
UIkit.util.on(sortable.$el, "added moved", function(e, sortable) {
sortable.items.forEach(function(item, index) {
console.log({ item, index});
// Grab data attributes if you need to.
// UIkit.util.data(item, "id");
});
});
回调的第二个参数引用可排序组件并包含项目元素数组。遍历此数组并使用索引(基于 0)来获取项目的新顺序。使用 .uk-sortable-item
或使用 cls-item
选项为可排序组件定义不同的 class 到 return 项目很重要。
你也不需要像我一样定义 sortable ,你可以只使用 UIkit.util.on 和 CSS 选择器,例如UIkit.util.on("#sortable-element", "added moved removed start stop", function(e, sortable) { console.log(e.type); });
UIkit.util 或多或少没有记录,但它构建得非常好。检查存储库以查看可用功能。它们绑定到 dist/uikit.js 文件中的 UIkit.util。 https://github.com/uikit/uikit/tree/develop/src/js/util
我实施了 UIkit sortable component 并添加了一个 stop
事件。但是如果一个项目被拖动,我无法弄清楚如何计算新订单。到目前为止,我唯一能想到的就是给每个项目一个 id,然后根据该 id 进行计算,但这似乎不是正确的方法
有一种非常简单的方法可以实现这一点。 element 存储 originalEvent ,您还可以在其中找到 explicitOriginalTarget - 我们移动的元素。由于它被包裹在 ul 里面的 li 中,我上升到它的 parentNode (li),所以我处于我需要的元素级别,然后将它转换为 jQuery 对象(你不必,我做了只是因为它很快),然后你就可以得到它的索引。所有这些值都可以通过 console.log(e);
此解决方案的唯一问题是性能,它可以工作,但是当您过于频繁地移动元素时,它可能会显示 0 而不是正确的索引值
编辑: 我意识到你可能在询问整组项目及其顺序,而不仅仅是当前移动项目的索引,所以我还添加了控制台日志记录这也是
示例如下:
var indexes = new Array();
$(document).on('moved', '.uk-sortable', function(e) {
var currentLi = e.originalEvent.explicitOriginalTarget.parentNode;
indexes = [];
$(this).find('li').each(function() {
indexes.push($(this).data("index"));
});
alert("New position: " + $(currentLi).index());
console.log(indexes);
});
$('.uk-sortable').find('li').each(function(i) {
$(this).data("index", i);
indexes.push(i);
});
console.log(indexes);
<!-- UIkit CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.35/css/uikit.min.css" />
<!-- UIkit JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.35/js/uikit.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.35/js/uikit-icons.min.js"></script>
<ul class="uk-grid-small uk-child-width-1-4 uk-text-center" uk-sortable="handle: .uk-card" uk-grid>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 1</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 2</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 3</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 4</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 5</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 6</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 7</div>
</li>
<li>
<div class="uk-card uk-card-default uk-card-body">Item 8</div>
</li>
</ul>
我发现的最简单的方法是获取所有元素的列表并执行映射操作,returns 一组独特且可识别的属性(例如,可排序元素的 ID。
moved 事件有一个 detail 属性,它是一个包含 UIKitComponent 和目标元素的数组;您可以从 UIKitComponent 中获取 items。
const new_order = event.detail[0].items.map(el => el.id);
//["id-1", "id-2", "id-3"];
你可以在事后得到索引,至少混乱的 DOM 方面已经排序了。
我在搜索其他内容时遇到了这个问题,并且碰巧知道您正在寻找的答案。您不需要 jQuery 或其他任何东西,只需要 UIkit。
<ul id="sortable-element" uk-sortable>
<li class="uk-sortable-item" data-id="1">Content</li>
<li class="uk-sortable-item" data-id="2">Content</li>
<li class="uk-sortable-item" data-id="3">Content</li>
<li class="uk-sortable-item" data-id="4">Content</li>
<li class="uk-sortable-item" data-id="5">Content</li>
</ul>
let sortable = UIkit.sortable("#sortable-element");
UIkit.util.on(sortable.$el, "added moved", function(e, sortable) {
sortable.items.forEach(function(item, index) {
console.log({ item, index});
// Grab data attributes if you need to.
// UIkit.util.data(item, "id");
});
});
回调的第二个参数引用可排序组件并包含项目元素数组。遍历此数组并使用索引(基于 0)来获取项目的新顺序。使用 .uk-sortable-item
或使用 cls-item
选项为可排序组件定义不同的 class 到 return 项目很重要。
你也不需要像我一样定义 sortable ,你可以只使用 UIkit.util.on 和 CSS 选择器,例如UIkit.util.on("#sortable-element", "added moved removed start stop", function(e, sortable) { console.log(e.type); });
UIkit.util 或多或少没有记录,但它构建得非常好。检查存储库以查看可用功能。它们绑定到 dist/uikit.js 文件中的 UIkit.util。 https://github.com/uikit/uikit/tree/develop/src/js/util