22

サブビューモデルで発生したクリック イベントを祖父母または $parents[1] に通知したい状況があります。だから基本的に私はこれができるようになりたいです

self.$parents[1].actionTaken

context と viewModel のバインドが原因で、これは機能しないと思いますが、このようなことを行う正しい方法について誰かがアイデアを持っているかどうかを知りたいです。ありがとう

 self.save = function () {

     //do stuff to self first, then

      self.$parents[1].actionTaken();

};
4

4 に答える 4

25

またはbindトリックを使用する

data-bind="click: $parent.foo.bind($parent)"

foo 関数にアクセスすると、thisキーワードは親コンテキストを指します。

foo: function(child) {
   this.children.remove(child);
}
于 2013-08-09T07:49:44.607 に答える
16

最近では (ノックアウト 3.0.0 を使用して) 子関数 (クリック バインディングによって実行される) に 2 つのパラメーターを追加するだけで済みます。最初のパラメーターには現在のビューモデルが割り当てられ、2 番目のパラメーターにはクリック イベント引数が割り当てられます。

次に、ko.contextFor() を呼び出してイベント ターゲットを渡すと、コンテキスト オブジェクトを介して $parent にアクセスできるようになります。

this.myChildFunction = function (vm, e) {
  var context = ko.contextFor(e.target);
  context.$parent.myParentFunction();
};

(他の回答の時点でこれが可能であったかどうかはわかりません...)

于 2016-10-21T18:19:51.250 に答える
3

実際、knockoutjs の世界では viewmodel でアクションが定義されています。$parents/$data は「コンテキスト」です。あなたのニーズを実証するためにデータ構造を作成します。会社>営業部門>従業員

この jsfiddle の例でそれを見つけることができます: 子イベントでルート アクションを呼び出す

それでも何らかの理由でこれを行いたい場合は、祖父母のコンテキストで(viewmodel メソッドとしてではなく) actionTaken()関数を定義することもできます。しかし、それは通常の方法ではないかもしれません。とにかく、これをチェックしてください:

self.company={name:'ABC', click:function(){self.onCompClicked();}, salesDepartment:{manager:'Mgr',employees:['Smith','John']}};

次に、バインディング クリック イベントを次のように変更します。

data-bind="text: $data, click: $parents[1].click"

第 2 版の更新されたコードは次のとおりです: 子イベントでコンテキスト アクションを呼び出す

于 2013-08-09T02:19:47.573 に答える