4

1つの関数を複数のプロパティにサブスクライブするときに、サブスクライブされた関数を呼び出しているプロパティを見つける方法はありますか?

コード例。

var self = this;
$(document).ready(function(){

var myViewModel = 
{
    FirstName : ko.observable("Bert"),
    LastName : ko.observable("pual")
};
myViewModel.FirstName.subscribe(self.notifyChange);

myViewModel.LastName.subscribe(self.notifyChange);

ko.applyBindings(myViewModel);
});
notifyChange = function ( newValue ) {// want to find which property(FirstName/LastName) is calling the function }

HTML

<body>
Enter your name:
<input id="source" data-bind="value: FirstName" />
<input id="Text1" data-bind="value: LastName" />    

ここでは、FirstNameとLastNameの両方の「notifyChange」関数をサブスクライブしました。いずれかの値が変更された場合、それはnotifyChange関数を呼び出します。どのプロパティの変更がnotifyChange関数を呼び出すのか知りたいですか?

4

2 に答える 2

2

誰が実際に関数を呼び出したかはわかりません。

1つの選択肢はnotifyChange関数を使用するbindことですが、いずれの場合も適切なプロパティを使用します。これで、またはobservablethisに設定されます。を実行すると、関数のラッパーが作成されますが、少なくとも実際の実装は1回だけ存在します。FirstNameLastNamebindnotifyChange

myViewModel.FirstName.subscribe(self.notifyChange.bind(myViewModel.FirstName));
myViewModel.LastName.subscribe(self.notifyChange.bind(myViewModel.LastName));

したがって、this内部はnotifyChange適切な観測量になります。

于 2012-05-17T15:38:11.313 に答える
0

この質問は6年以上前に行われ、回答されたことを私は理解しています。しかし、多分私の答えはまだ誰かのために役立つことができます。

受け入れられた答えは、コールバック関数のコンテキストとしてobservableを渡すことに基づいています。ちなみに、を使用する必要はありませんbind()。2番目のパラメータとしてコンテキストを次のパラメータに渡すことができますsubscribe()

myViewModel.FirstName.subscribe(self.notifyChange, myViewModel.FirstName);

Knockoutはbind()内部で使用します。

ただし、(私が行ったように)コールバック関数内のコンテキストを変更する余裕がない場合(そのコンテキスト内にプロパティと関数が必要です)、コールバック関数を別の関数でラップし、追加のパラメーターをコールバックに渡してみませんか?働き:

myViewModel.FirstName.subscribe(function (value) { self.notifyChange('FirstName', value); });
myViewModel.LastName.subscribe(function (value) { self.notifyChange('LastName', value); });

これをループで使用する場合、たとえば、ViewModelのプロパティを列挙している場合は、次のように全体をIIFEでラップできます。

// .. property is an enumerated reference to an ko.observer
// .. propertyName is a string identifying it (for instance 'FirstName')
(function (elementName) {
    property.subscribe(function(value) { 
        self.notifyChange(elementName, value);
    });
})(propertyName);
于 2018-06-26T18:24:55.513 に答える