2017-08-31 5 views
0

私はC#環境から来て、そこにはINotifyPropertyChangedインターフェイスがあります。このプロパティ変更イベントにサブスクライブすると、送信者とプロパティ名が受信されます。この例では、送信者はViewModelです。私はKnockoutJSと似たものを持っていたい。私は購読し、ViewModelとPropertyNameパラメータを持つオブジェクトを含むハッシュテーブルに関数のインスタンスを格納しようとしました。 Observableの新しい値は、私がイベントを使用するために十分ではないためです。グローバルプロパティを変更する方法KnockoutJSでイベントハンドラを変更する

C#のINotifyPropertyChangedと同様の方法で動作するKOでコードを作成するにはどうすればよいですか?

これは私が何らかの努力をしてくれたことを示すために書きました。しかし、私はここで悲惨に失敗しています。ノックアウトdocsから

var propertyChangedHashTable = new Hashtable(); 

function PropertyChanged(newValue) { 
    console.log(this); 
    var changedEventParams = propertyChangedHashTable[this]; 
    console.log(changedEventParams); 
    //gateway.propertyChanged(changedEventParams.viewModel, changedEventParams.propertyName, newValue); 
}; 

function subscribePropertyChanged(viewModel, objectPath) { 
    if (typeof objectPath === "undefined" || objectPath == null) objectPath = ""; 
    if (objectPath.length !== 0) objectPath += '.'; 
    var observable = ko.observable("").toString(); 

    for (var propertyName in viewModel) { 
     var viewModelName = viewModel.__proto__.constructor.name; 
     var localObjectPath = objectPath + viewModelName; 
     var property = viewModel[propertyName]; 
     if (propertyName.indexOf("ViewModel") !== -1) { 
      subscribePropertyChanged(property, localObjectPath); 
      continue; 
     } 
     var isObservable = property.toString() === observable.toString(); 
     if (!isObservable) continue; 

     var propertyChangedFunc = PropertyChanged; 

     propertyChangedHashTable.put(propertyChangedFunc, 'test'); 
     property.subscribe(propertyChangedFunc); 
    } 
} 

function MainViewModel() { 
    var self = this; 
    self.isRecording = ko.observable(false); 
    self.dataDirectory = ko.observable("C:\\Temp\\Recordings"); 
    self.toggleIsRecording = function() { 
     self.isRecording(!self.isRecording()); 
    }; 
} 

var viewModel = new MainViewModel(); 
subscribePropertyChanged(viewModel); 

答えて

1

加入関数は3つのパラメータを受け入れる:コールバック通知が発生するたびに呼び出される関数であり、ターゲット(オプション)は、コールバック関数内でこの値を定義、event(オプション、デフォルトは "change")は、通知を受け取るイベントの名前です。

あなたはsubscribe()の二番目の引数「ターゲット」としてのViewModelを供給するのであれば、あなたはthisとしてハンドラの中でそれにアクセスすることができます。例:

<p data-bind="text: counter"></p> 
<button data-bind="click: buttonClicked">Increment</button> 

<script type="text/javascript"> 
var ViewModel = function() { 
    this.counter = ko.observable(0); 
    this.buttonClicked = function() { 
     this.counter(this.counter() + 1); 
    }; 

    this.counter.subscribe(function(newValue) { 
     console.log(newValue); 
     console.log(this); 
    }, this); 
}; 

ko.applyBindings(new ViewModel()); 
</script> 
関連する問題