13

私のビュー モデルには、実際のビュー モデルではなく、このコンテキストが for each のアイテムであるプロトタイプ メソッドがあります。どうすればこれを達成できますか?

  <button data-bind="click: $parent.methodThatNeedsAccesToTheParentViewModel">Edit</button>

ビューモデル:

ViewModel.prototype.methodThatNeedsAccesToTheParentViewModel= function () {
        this = duff //this is the item in the foreach, not the real parent
    };

アイデア?

4

3 に答える 3

14

関数をクリックバインディングに直接渡さないでください。匿名関数でラップして、ビューモデルのコンテキストで呼び出されるようにしてください。

<button data-bind="click: function() { $parent.methodThatNeedsAccesToTheParentViewModel() }">Edit</button>

このように、バインディングがアクティブ化されると、呼び出しのコンテキストとして$parentが使用されます。

$ parent変数は、現在のアイテムが繰り返される前のバインディングを参照することに注意してください。これは、オブジェクトグラフのアイテムの親である必要はありません。

編集:私は上記のいくつかの括弧が欠けていました...

編集2:これはバインディングが解決される方法のために機能します。バインドがノックアウトによって適用されると、式は解決され、関数に評価される必要があります(したがって、関数に直接バインドする場合、括弧は必要ありません)。この関数は、クリックバインディングがアクティブ化されたときに呼び出されます。

しかし、ここに問題があります。プロトタイプのjavascriptのthisキーワードは、関数の所有者(つまり、関数が定義されている場所)によってバインドされているのではなく、呼び出される方法(mozillaのドキュメントで詳しく説明されている)によってバインドされているためです。関数は、それを所有するオブジェクト(this演算子を正しくバインドします)を介さずに、現在のバインドコンテキストに明示的にバインドします(関数が最初に取得されたインスタンスを認識できない可能性があるため)。関数への参照を取得し、呼び出し時に別のオブジェクトにバインドすることで、この動作を再現できます。例:

A = function() {
   this.name = "foo";
};
A.prototype.getName = function() { return this.name; };

a = new A();

console.log(a.getName()); // should log "foo" as expected

f = a.getName; // now f contains a reference to the function

console.log(f()); // this call the function in the current scope - most likely the window, and return nothing

b = new Object(); // another generic object - suppose this is knockout binding context

console.log(f.call(b)); // this bind the call explicitly to b, but since b has no name property,  nothing is returned again

console.log(f.call(a)); // this time we bind the function call to an object that has a name proerty, so the correct value is returned

一方、無名関数を作成することにより、必要なオブジェクト($ parent)のスコープでメソッドを明示的に呼び出すため、これは正しくバインドされます。

私はそれが少し役立つことを願っています...:)

于 2013-03-06T16:36:48.410 に答える
0

データバインドに$parentがあるので、親のメソッドを呼び出す必要があります。データバインドとして$data.methodThatNeedsAccesToTheParentViewModelを使用するつもりでしたか?行った場合は、ノックアウトポストボックスまたはjquerypubsubプラグインのいずれかのある種のpubsubフレームワークを調べる必要があります

于 2013-03-06T16:31:33.823 に答える