2012-02-16 5 views

答えて

12

bindを呼び出すと、最初のパラメータはthisの値になります。だから、this$dataとなり、最初の引数は$parentとなります。

$rootは、このケースで$parentであれば、あなただけ行うことができます:最初のパラメータとthis$rootに設定されるように

$root.deleteSomeEntity.bind($root)

KOは、データを渡します。

$parent$rootではありません(そして、あなたはおそらくthisがルート上のあなたの方法で$rootことを別のオブジェクトであることに依存したくない)、そしてあなたのようなものだろう場合:

$root.deleteSomeEntity.bind($root, $data, $parent)

をそれ以外の場合は、確かにあなたのビューモデル内に適切なthisがあることを確認する方法があります。あなたの構造にもよりますが。

+0

を:http://jsfiddle.net/6MmWs/5/しかし、 Deleteをクリックし、 'self.deleteContactPhone = function(viewModel、phone、contact)' viewModelは電話、電話は連絡先、連絡先は電話です。 'これは現在のビューモデルです。 – kendaleiv

+1

あなたはもっとそれを望むでしょう:http://jsfiddle.net/rniemeyer/6MmWs/6/。言及するべきカップルの事柄。 'remove'はobservableArrayで利用できる関数です。あなたの 'phones'配列を監視可能にするように変更しました。そうすれば、あなたは' remove'を持ってUIが更新されます。 –

+0

もう一つは、関数の署名を 'function(phone、contact)'にすることです。 'bind'の最初のパラメータはターゲットで、関数が実行されたときに' this'の値を制御するために使用されます。したがって、実際には関数の引数ではありません。 –

2

なぜbind()を使用していますか?デフォルトでは、javacript関数の名前をクリックイベントとして書き込むと、Knockoutは最初の引数として$dataを渡し、2番目の引数としてイベントを渡します。

http://knockoutjs.com/documentation/click-binding.html(1 &注2)

なぜあなたは、単にこれを行うことができるときbind()を気:あなたの提案に続き

data-bind="click: function() {$root.deleteSomeEntity($data, $parent)}" 
+0

そのコードは私のためにクリックせずに実行されているようです。それはdata-bind = "foreach:..."の内部にあります。 – kendaleiv

+0

もちろんそれはありません!申し訳ありませんが、私は 'function()'がクリックバインディングの周りにくるようにコードを編集しました。これは今や期待どおりに動作するはずです。 – soniiic

+1

それはちょうどスタイルのものです。多くの人々は、マークアップに無名関数を入れることを好まない。これは、KOで始まったとき、特にもっと控えめなアプローチに慣れているときに、人々をオフにすることの1つです。いずれにしてもうまく動作しますが、ビューモデル自体に 'this'が適切に設定されていることを確認する方が好きです。 –

関連する問題