gpt4 book ai didi

javascript - jQuery Sortable 更新数据未被序列化

转载 作者:行者123 更新时间:2023-11-29 19:38:28 25 4
gpt4 key购买 nike

我正在使用 jQuery Sortable plugin .

查看有关如何序列化数据的基本示例,我有以下代码。

    <div class='span4'>
<ol class='serialization vertical'>
<li data-id='1' data-name='Item 1' data-status='1'>Item 1 <span class="status">toggle</span></li>
<li data-id='2' data-name='Item 2' data-status='1'>Item 2 <span class="status">toggle</span></li>
<li data-id='3' data-name='Item 3' data-status='1'>Item 3 <span class="status">toggle</span></li>
<li data-id='4' data-name='Item 4' data-status='1'>Item 4 <span class="status">toggle</span></li>
<li data-id='5' data-name='Item 5' data-status='1'>Item 5 <span class="status">toggle</span></li>
<li data-id='6' data-name='Item 6' data-status='1'>Item 6 <span class="status">toggle</span></li>
</ol>
</div>

var group = $("ol.serialization").sortable({
group: 'serialization',
delay: 500,
onDrop: function (item, container, _super) {
var data = group.sortable("serialize").get();
var jsonString = JSON.stringify(data, null, ' ');
console.log(jsonString);
$('#serialize_output2').text(jsonString);
_super(item, container)
}
});

我想允许用户切换每个项目的状态,所以我也添加了

    jQuery(document).on("click", ".status", function (event) {
var status = $(this).closest("li").attr("data-status");
if(status == 1) {
$(this).closest("li").attr( 'data-status','0');
}
else {
$(this).closest("li").attr( 'data-status','1');
}
});

如果我在拖放列表项之前单击切换,console.log 将返回正确的状态(1 或 0)。

但是,在我拖放之后,如果我尝试单击以更新状态,然后再次拖放,console.log 会返回列表的正确顺序,但不是最新状态。

在这里我需要做什么来确保序列化数据反射(reflect)数据属性在放置时的值?

see this fiddle.

最佳答案

一、为什么“data-status”没有更新,如下:

  1. https://github.com/johnny/jquery-sortable/blob/master/source/js/jquery-sortable.js#L118

    var result = $.extend({}, $parent.data())
  2. https://github.com/jquery/jquery/blob/1.9-stable/src/data.js#L244

    if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
  3. https://github.com/jquery/jquery/blob/1.9-stable/src/data.js#L252

    dataAttr( elem, name, data[ name ] );
  4. https://github.com/jquery/jquery/blob/1.9-stable/src/data.js#L291

    if ( data === undefined && elem.nodeType === 1 ) {

所以原因是数据被jQuery缓存了

解决方法:

var group = $("ol.serialization").sortable({
group: 'serialization',
delay: 500,
onDrop: function (item, container, _super) {
group.children().each(function(){
jQuery._data(this, 'parsedAttrs', false);
jQuery.removeData(this);
});
var data = group.sortable("serialize").get();
var jsonString = JSON.stringify(data, null, ' ');
console.log(jsonString);
$('#serialize_output2').text(jsonString);
_super(item, container)
}
})

这把 fiddle :http://jsfiddle.net/hb6hU/1/

关于javascript - jQuery Sortable 更新数据未被序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24377212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com