【问题标题】:Knockout Sortable bind Order淘汰赛可排序绑定顺序
【发布时间】:2012-10-01 22:55:39
【问题描述】:

这是一个问题的后续:KnockoutJS Sortable group observableArray by field and conditionally sort

还有两件事我正在努力实现。首先,当嵌套列表项被拖到另一个列表时,父项为空,我想删除父项。我通过创建 afterMove 函数并检查 sourceParent 长度是否为 0 来完成此操作。然后我查看路由以查看是否有空任务数组并相应地删除。我想知道这是否是一个有效的解决方案。我还必须删除任务,否则任务订阅会在删除计划任务时添加重复项。

第二个也是最重要的基础对象(Task)有一个 order 属性。我想将此绑定到可排序的顺序,以便在将任务拖到计划列表中时更新顺序属性。如何从 sortable 回调中访问其他列表项的顺序?

请看下面这个Fiddle

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript jquery knockout.js jquery-ui-sortable


    【解决方案1】:

    对于第一个问题,有一种稍微优化的方法可以做到。 arg.sourceParent 包含在您要删除的 tasksByRoute 项目中。 remove 函数可以使用一个函数来针对项目运行。所以,你可以这样写:

    self.afterMoveCallback = function(arg) {
        if (arg.sourceParent().length === 0) {
            self.tasksByRoute.remove(function(route) {
               return route.tasks === arg.sourceParent; 
            });
        }
    };
    

    对于第二个问题,我真的很喜欢使用一个扩展来自动跟踪 observableArray 中的顺序。它看起来像:

    //track an index on items in an observableArray
    ko.observableArray.fn.indexed = function(prop) {
        prop = prop || 'index';
       //whenever the array changes, make one loop to update the index on each
       this.subscribe(function(newValue) {
           if (newValue) {
               var item;
               for (var i = 0, j = newValue.length; i < j; i++) {
                   item = newValue[i];
                   if (!ko.isObservable(item[prop])) {
                      item[prop] = ko.observable();
                   }
                   item[prop](i);  //add 1 here if you don't want it to be zero based
               }
           }   
       }); 
    
       //initialize the index
       this.valueHasMutated(); 
       return this;
    };
    

    在你的情况下,你会像这样使用它:

    self.scheduledTasks = ko.observableArray([
        new Task(8, 4, "Route 4", "Cust 8", 1),
        new Task(9, 4, "Route 4", "Cust 9", 2),
        new Task(10, 5, "Route 5", "Cust 10")
        ]).indexed("order");
    

    以下是更新了这两项更改的示例:http://jsfiddle.net/rniemeyer/usVKQ/

    【讨论】:

    • 很好的答案。我知道必须有更好的方法来解决第一个问题。我知道 observableArray 顺序与可排序匹配。这对我来说很神奇,但很棒。谢谢大家的帮助。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2013-11-20
    • 2013-10-31
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    相关资源
    最近更新 更多