Kendo ui 剑道可排序与剑道可观测数组

Kendo ui 剑道可排序与剑道可观测数组,kendo-ui,Kendo Ui,我使用的是剑道可排序数据源是剑道可观测数组, 在对div进行排序时,我们正在更新change事件中的数组对象, 但数组正在正确更新,但ui未更新。 你能帮帮我吗 <!DOCTYPE html> <html> <head> <title></title> <link href="http://cdn.kendostatic.com/2014.1.528/styles/kendo.common.min.css" rel

我使用的是剑道可排序数据源是剑道可观测数组, 在对div进行排序时,我们正在更新change事件中的数组对象, 但数组正在正确更新,但ui未更新。 你能帮帮我吗

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <link href="http://cdn.kendostatic.com/2014.1.528/styles/kendo.common.min.css" rel="stylesheet" />
    <link href="http://cdn.kendostatic.com/2014.1.528/styles/kendo.default.min.css" rel="stylesheet" />
    <link href="http://cdn.kendostatic.com/2014.1.528/styles/kendo.dataviz.min.css" rel="stylesheet" />
    <link href="http://cdn.kendostatic.com/2014.1.528/styles/kendo.dataviz.default.min.css" rel="stylesheet" />
    <script src="http://cdn.kendostatic.com/2014.1.528/js/jquery.min.js"></script>
    <script src="http://cdn.kendostatic.com/2014.1.528/js/kendo.all.min.js"></script>

</head>
<body>
    <div id="example">
        <div id="playlist">
            <ul id="sortable-basic" data-bind="source:items" data-template="template">
            </ul>
        </div>
        <script type="text/x-kendo-tmpl" id="template">
            <li class="sortable">#:value#<span>#:time#</span></li>
        </script>
        <script>
            var data;
            $(document).ready(function () {

                data = kendo.observable({
                    items: new kendo.data.ObservableArray([
                        { value: 'Papercut', time: '3:12' },
                        { value: 'One Step Closer ', time: '4:10' },
                        { value: 'With You ', time: '5:00' },
                        { value: 'Points of Authority ', time: '2:59' }]
                        )
                });
                kendo.bind($('#playlist'), data);

                $("#sortable-basic").kendoSortable({
                    change: function (e) {
                        var daa = data.items.splice(e.oldIndex, 1);
                        data.items.splice(e.newIndex, 0, daa[0]);                        
                    }
                });
            });
        </script>
        <style>
            #example
            {
                -webkit-user-select: none;
                -moz-user-select: none;
                -ms-user-select: none;
                user-select: none;
            }

            #playlist
            {
                margin: 30px auto;
                width: 300px;
                background-color: #f3f5f7;
                border-radius: 4px;
                border: 1px solid rgba(0,0,0,.1);
            }

            #playlist-title
            {
                height: 80px;
                border-radius: 4px 4px 0 0;
                border-bottom: 1px solid rgba(0,0,0,.1);
            }

                #playlist-title span
                {
                    display: none;
                }

            #sortable-basic
            {
                padding: 0;
                margin: 0;
            }

            li.sortable
            {
                list-style-type: none;
                padding: 6px 8px;
                margin: 0;
                color: #666;
                font-size: 1.2em;
            }

                li.sortable:last-child
                {
                    border-bottom: 0;
                    border-radius: 0 0 4px 4px;
                }

                li.sortable span
                {
                    display: block;
                    float: right;
                    color: #666;
                }

                li.sortable:hover
                {
                    background-color: #dceffd;
                }

            li.hint
            {
                display: block;
                width: 200px;
                background-color: #52aef7;
                color: #fff;
            }

                li.hint:after
                {
                    content: "";
                    display: block;
                    width: 0;
                    height: 0;
                    border-top: 6px solid transparent;
                    border-bottom: 6px solid transparent;
                    border-left: 6px solid #52aef7;
                    position: absolute;
                    left: 216px;
                    top: 8px;
                }

                li.hint:last-child
                {
                    border-radius: 4px;
                }

                li.hint span
                {
                    color: #fff;
                }

            li.placeholder
            {
                background-color: #dceffd;
                color: #52aef7;
                text-align: right;
            }
        </style>
    </div>
</body>
</html>

  • #:值##:时间#
  • var数据; $(文档).ready(函数(){ 数据=剑道。可观察({ 项目:新剑道.data.ObservableArray([ {值:'Papercut',时间:'3:12'}, {值:'更近一步',时间:'4:10'}, {值:'和你在一起',时间:'5:00'}, {值:'权限点',时间:'2:59'}] ) }); bind($('#playlist'),数据); $(“#可排序基本”).kendoSortable({ 更改:功能(e){ var daa=数据项拼接(如oldIndex,1); 数据项拼接(e.newIndex,0,daa[0]); } }); }); #范例 { -webkit用户选择:无; -moz用户选择:无; -ms用户选择:无; 用户选择:无; } #播放列表 { 保证金:30像素自动; 宽度:300px; 背景色:#f3f5f7; 边界半径:4px; 边框:1px实心rgba(0,0,0,1); } #播放列表标题 { 高度:80px; 边界半径:4px4p0; 边框底部:1px实心rgba(0,0,0,1); } #播放列表标题范围 { 显示:无; } #可排序基本 { 填充:0; 保证金:0; } 可排序的 { 列表样式类型:无; 填充:6px 8px; 保证金:0; 颜色:#666; 字体大小:1.2米; } 李:最后一个孩子 { 边界底部:0; 边界半径:0 0 4px 4px; } 可排序跨度 { 显示:块; 浮动:对; 颜色:#666; } 分类:悬停 { 背景色:#dceffd; } 提示 { 显示:块; 宽度:200px; 背景色:#52aef7; 颜色:#fff; } 提示:之后 { 内容:“; 显示:块; 宽度:0; 身高:0; 边框顶部:6px实心透明; 边框底部:6px实心透明; 左边框:6px实心#52aef7; 位置:绝对位置; 左:216px; 顶部:8px; } 提示:最后一个孩子 { 边界半径:4px; } 李彦宏 { 颜色:#fff; } li.占位符 { 背景色:#dceffd; 颜色:#52aef7; 文本对齐:右对齐; }
    我想我发现了你的问题。这似乎是更改函数,只需删除它,您就可以对列表进行排序。

    我没有使用kendoSortable,但我假设它已经在维护数组排序,因为您已将数组绑定到kendoSortable。这就是绑定的目的,它为您保持数据和元素的同步。您在change事件中所做的只是撤消绑定刚刚完成的工作,即对元素和绑定数组进行排序

    根据telerik,

    您必须手动执行此操作,而将可排序表附加到数组不会自动执行任何操作。所以你们所做的是正确的,然而,即使你们的变化在可观察数组中正确反映,它也不会出现在屏幕上

    所以我们必须触发clear and change事件,以便将UI与阵列同步。也许有一种更好的方法可以在不清除数组的情况下调用sync,但这是一种对我有效的方法

    下面是一个示例代码,我们在其中清除数组,然后重新插入,从而解决了问题

        $("#sortable-basic").kendoSortable({
                    change: function (e) {
                        var daa = data.items.splice(e.oldIndex, 1);
                        data.items.splice(e.newIndex, 0, daa[0]);
                        var copiedArray = data.items.splice(0, data.items.length);
                        $.each(copiedArray,
                            function (index, item) {
                                data.items.push(item);
                            });
    
                    }
                });
    

    Hi Hinogi,你是对的,如果我删除了更改事件,它工作正常。但我希望我的可观察数组项也会根据divs排序进行更改。