在selectOptions属性中Knockout JS调用函数

时间:2015-01-26 13:05:48

标签: javascript data-binding knockout.js

我得到了以下内容:

<select data-bind="options: infoLogMessages, selectedOptions: setCurrentInfoLogMessage"></select>

我有一个看起来像的视图模型:

var InfoLogFilterVM = function () {
    this.propertyChangeSupport = new KnockoutPropertyChangeSupport(this);

    this.currentInfoLogMessage = ko.observable();
    this.infoLogMessages = ko.observableArray();
}

InfoLogFilterVM.prototype = (function() {
return {
    PROP_CURRENTINFOLOGMESSAGE: "currentInfoLogMessage",
    PROP_INFOLOGMESSAGES: "infoLogMessages",

    addPropertyChangeListener: function(listener) {
        this.propertyChangeSupport.addListener(listener);
    },

    removePropertyChangeListener: function(listener) {
        this.propertyChangeSupport.removeListener(listener);
    },

    setCurrentInfoLogMessage: function(currentInfoLogMessage) {
        var oldValue = this.currentInfoLogMessage();
        this.currentInfoLogMessage(currentInfoLogMessage);
        this.propertyChangeSupport.firePropertyChangeEvent(this.PROP_CURRENTINFOLOGMESSAGE, oldValue, currentInfoLogMessage);
    },

    getCurrentInfoLogMessage: function() {
        return this.currentInfoLogMessage();
    },

    setInfoLogMessages: function(infoLogMessages) {
        var oldValue = this.infoLogMessages();
        this.infoLogMessages(infoLogMessages);
        this.propertyChangeSupport.firePropertyChangeEvent(this.PROP_INFOLOGMESSAGES, oldValue, infoLogMessages);
    },

    getInfoLogMessages: function () {
        return this.infoLogMessages();
    },
}
}());

我希望在视图模型中调用setCurrentInfoLogMessage函数,这样我就可以触发属性更改事件,这意味着我对直接调用currentInfoLogMessage属性不感兴趣:

selectedOptions: currentInfoLogMessage

我尝试将selectedOptions更改为

value: setCurrentInfoLogMessage

我也尝试过这样的事情:

selectedOptions: function (_infoLogMessage) { setCurrentInfoLogMessage(_infoLogMessage) }

但没有任何作用。

实际上是否有一种方法可以使用selectedOptions或value属性调用data-bind属性中的自定义函数?

1 个答案:

答案 0 :(得分:0)

正如我的评论中提到的,我建议从另一种方式接近这一点。也就是说,使用writable computed observables

可以实现您的目标
var _logMessageValue = ko.observable();
this.currentInfoLogMessage = ko.pureComputed({
    read: function () {
        return this._logMessageValue();
    },
    write: function (value) {
        var oldValue = this._logMessageValue();
        this._logMessageValue(value);
        this.propertyChangeSupport.firePropertyChangeEvent(this.PROP_CURRENTINFOLOGMESSAGE, oldValue, value);               
    },
    owner: this
});