首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >剔除js在排序数组项后强制重新绑定。

剔除js在排序数组项后强制重新绑定。
EN

Stack Overflow用户
提问于 2012-06-09 23:40:19
回答 1查看 2.1K关注 0票数 3

在击倒js方面有困难。但在我看来好像是个虫子。也许有一些解决办法。

有一个排序列表这里的例子,它可以工作。还有另一个例子和它没有,它们之间唯一的区别是KO的版本。

任何帮助都将不胜感激。

更新:,我不知道原因,但是在调用splice之后,KO以某种不正确的方式刷新绑定。所以我找到的解决办法是-强制重新绑定数组模型。

用于强制重新绑定的代码如下:

代码语言:javascript
运行
复制
        // newArray is ko.observableArray([...])
        var original = newArray();
        newArray([]);
        newArray(original); // KO will rebind this array

是否有更优雅的方式强制重新绑定?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-11 11:53:59

我相信这里发生的事情是,当您将新项拼接到列表中时,Knockout 2.1正在正确地更新列表,但是jQuery UI可排序实现是,也是将该项添加到新列表中。

为了解决这个问题,我向可排序实现添加的项中添加了一个“拖放”类,然后在更新两个数组(这将导致UI按预期更新)后将其删除。

代码语言:javascript
运行
复制
    $list
      .data('ko-sort-array', array)
      .sortable(config)
      .bind('sortstart', function (event, ui) {                  
        ui.item.data('ko-sort-array', array);
        ui.item.data('ko-sort-index', ui.item.index());
        ui.item.addClass('dragged'); // <-- add class here
      })
      .bind('sortupdate', function (event, ui) {
        var $newList = ui.item.parent();
        if($newList[0] != $list[0]){ return; }

        var oldArray = ui.item.data('ko-sort-array');
        var oldIndex = ui.item.data('ko-sort-index');

        var newArray = $newList.data('ko-sort-array');
        var newIndex = ui.item.index();

        var item = oldArray.splice(oldIndex, 1)[0];
        newArray.splice(newIndex, 0, item);
        $list.find('.dragged').remove(); // <-- remove the item added by jQuery here
      });

您可以看到这个工作的这里

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10965383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档