2012-02-27 4 views
3

Ryan Niemeyerのドラッグアンドドロッププラグイン(http://www.knockmeout.net/2012/02/revisiting-dragging-dropping-and.html)を使用してプロジェクトを変換しようとしています。observableArrayの親を探す

アイテムを別のグループにドラッグすると、ドラッグされたアイテムのプロパティを、にドラッグされているobservableArrayを含むオブジェクトに基づいて設定する必要があります。

Iは、線に沿ってビューモデルを有する:ViewModelに

    • TopLevelObject
      • 子供(observableArray)その親プロパティがTopLevelObjectに設定されている
        • チャイルドA
        • その親プロパティがTopLevelObjectに設定されている
          • 子Bの子供(observableArray)親プロパティは子どもB
          • その親プロパティが設定されている子Yに設定されている
            • 子X子B子供B

それは私が設定する必要があり、親プロパティです。私はarg.targetParentにアクセスしていますが、上記の例では 'Children' observableArrayです。だから私は解決策のようなものに見えると思います:

ko.bindingHandlers.sortable.afterMove = function(arg) { 
    // how do I get the object that contains the arg.targetParent observable array?? 
    var parentOfTargetObservableArray = /* the containing object of arg.targetParent */      
    arg.item.MyParent(parentOfTargetObservableArray); 
} 

分離でobservableArrayを考えると、それを含むオブジェクトを見つけるための方法があるの?

答えて

4

あなたが直接、さらに手がかりを残さずにobservableArrayの親に取得することはできませんオブジェクト上に。

- observableArrayのプロパティとして親を追加します。observableArraysはオブジェクトで機能し、あるので、あなたが実際のようにそれらにプロパティを追加することができます:あなたはへのアクセスを得ることができれば、その後、あなたは、単にarg.targetParent

-otherwiseのオフparentプロパティを読み取ることができます

this.Children = ko.observableArray(...); 
this.Children.parent = parent; 

より高いレベルのオブジェクト(おそらくそれはすでにグローバル)である場合、トップレベルの子をループして、チェックすることができます。topLevelChild.Children === arg.targetParent

コードサンプルが必要な場合はお知らせください。

+0

ありがとう、Ryan。これは私が簡単に親に行くことができないことを確認しました(私は怒っていると思っていました!)。私は "this.Children.parent = parent;"が好きです私が必要とするargオブジェクトの追加情報を含めるようにソート可能なプラグインを拡張しようとするかもしれません(例:targetParentContainer:ko.dataFor(ui.item.parent()[0] ); ")。 –

+1

私は 'ui'と' event'引数をコールバックに公開することを検討するかもしれません。 –

+0

良いアイデア。これは確かに、ko.dataFor()、.data()、.parent()などの関数を呼びたい場合が増えています。 –

0

ノックアウトには、DOM要素を与える機能があり、最も近いノックアウトの親を見つけることができます。この関数はko.dataFor()と呼ばれます。あなたはここでの例を見ることができます:Using unobtrusive event handlers

ここでテストされていないが、dataForの使用を実証コードの迅速なハックです:

ko.bindingHandlers.sortable.afterMove = function(arg) { 
    var parentOfTargetObservableArray = ko.dataFor(arg.targetParent); 
    arg.item.MyParent(parentOfTargetObservableArray); 
} 
+0

あなたの答え、soniiicに感謝します。しかし、arg.targetParentはobservableArrayであり、dom要素ではないため、ko.dataForは機能しません。 –

関連する問題