Events 如何使用KnockoutJS更改全局属性事件处理程序

Events 如何使用KnockoutJS更改全局属性事件处理程序,events,knockout.js,propertychanged,Events,Knockout.js,Propertychanged,我来自一个C#环境,在那里我们有INotifyPropertyChanged接口。订阅此属性更改事件时,将收到发件人和属性名称。发送方是本例中的ViewModel。我想要一些类似于KnockoutJS的东西。我试图订阅函数实例并将其存储到一个哈希表中,该哈希表包含一个具有ViewModel和PropertyName参数的对象。因为observable中的新值不足以满足我想要使用事件的目的 如何使用KO创建与C#的INotifyPropertyChanged工作方式类似的代码 这是我写给你的一些废

我来自一个C#环境,在那里我们有INotifyPropertyChanged接口。订阅此属性更改事件时,将收到发件人和属性名称。发送方是本例中的ViewModel。我想要一些类似于KnockoutJS的东西。我试图订阅函数实例并将其存储到一个哈希表中,该哈希表包含一个具有ViewModel和PropertyName参数的对象。因为observable中的新值不足以满足我想要使用事件的目的

如何使用KO创建与C#的INotifyPropertyChanged工作方式类似的代码

这是我写给你的一些废话,表明我付出了一些努力。但我在这里失败得很惨

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);
在淘汰赛中:

subscribe函数接受三个参数:callback是在通知发生时调用的函数,target(可选)在callback函数中定义此参数的值,event(可选;默认为“change”)是接收通知的事件的名称

因此,如果将ViewModel作为第二个参数“target”提供给
subscribe()
,则可以在处理程序中作为
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>

增量 var ViewModel=函数(){ this.counter=ko.可观察(0); this.buttonClicked=函数(){ this.counter(this.counter()+1); }; this.counter.subscribe(函数(newValue){ console.log(newValue); console.log(this); },这个); }; 应用绑定(新的ViewModel());