2

これは質問へのフォローアップです: KnockoutJS ソート可能なグループ observableArray によるフィールドと条件付きソート

私が達成しようと戦っていることがさらに 2 つあります。最初に、ネストされたリスト項目が別のリストにドラッグされ、親が空のままになっている場合、親を削除したいと思います。これは、afterMove 関数を作成し、sourceParent の長さが 0 かどうかを確認することで実現しました。次に、ルートを調べて空のタスク配列があるかどうかを確認し、それに応じて削除します。これが効率的な解決策であるかどうかを知りたいです。また、タスクを削除する必要があります。そうしないと、スケジュールされたタスクを削除するときに、タスク サブスクリプションによって重複が追加されます。

2 番目に最も重要なことは、ベース オブジェクト (タスク) には順序プロパティがあります。これを並べ替え可能な順序にバインドして、タスクが [スケジュール済み] リストの周りにドラッグされたときに順序プロパティが更新されるようにします。ソート可能なコールバックから他のリスト項目の順序にアクセスするにはどうすればよいですか?

次のこのFiddleを参照してください。

どんな援助でも大歓迎です。

4

1 に答える 1

6

最初の問題については、少し最適化された方法があります。 削除したい項目にarg.sourceParent含まれています。tasksByRouteこのremove関数は、項目に対して実行する関数を取ることができます。したがって、次のように記述できます。

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

2 番目の問題については、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/

于 2012-10-11T13:29:14.323 に答える