2012-10-11 51 views
2

這是一個問題的跟進:KnockoutJS Sortable group observableArray by field and conditionally sortKnockout Sortable bind Order

還有兩件事我正在努力實現。首先當一個嵌套列表項被拖拽到另一個列表中時,我將刪除父項。我通過創建afterMove函數並檢查sourceParent長度是否爲0來完成此操作。然後,我查看路由以查看是否有任何空白任務數組並相應地刪除。我想知道這是否是一種有效的解決方案。我還必須刪除任務,否則在刪除計劃任務時訂閱任務會添加重複項。

其次,最重要的是基礎對象(任務)有一個訂單屬性。我想將它綁定到可排序的順序,這樣當任務在計劃列表中拖動時,訂單屬性就會更新。如何從可排序回調中訪問其他列表項目的順序?

請參閱以下Fiddle

任何援助將不勝感激。

回答

6

對於第一個問題,有一個稍微優化的方法,你可以做到這一點。 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/

+0

偉大的答案。我知道必須有更好的方法來解決第一個問題。我知道可觀察陣列與排序匹配。這對我來說很神奇,但太棒了。感謝您的幫助。非常感謝。 – TheGwa