Knockout订阅/事件类型系统没有可观察?

时间:2015-06-14 08:51:22

标签: javascript knockout.js

我想利用knockout js的subscribe()函数在某一点手动触发事件。

我可以创建一个observable()并且每次都在那里放置一个GUID来触发scubscribe。

在Knockout js中有一种更清晰的方式可以拥有典型的类似事件的结构吗?

修改 好吧,显然我可以使用observable.valueHasMutated() - 可能已经比使用GUID更清晰。

示例

这是我正在寻找的行为:

function Car()
{
    var self = this;

    self.onOpenDoor = ko.observable();

    self.openDoor = function()
    {
        // using an observable / valueHasMutated for this feels a bit hacky
        // is there an other way to use the underlying subscribe() system?
        self.onOpenDoor.valueHasMutated();
    }
}


var car = new Car();

// multiple subscribers
car.onOpenDoor.subscribe(function()
{
    console.log('Do something');
})
car.o**nOpenDoor.subscribe(function()
{
    console.log('Do something else');
})

car.openDoor();

我知道这不是默认的'淘汰'做事的方式 - 这不是这个问题的关键。

更新

在@ RoyJ提到Niemeyer的博客后,我选择了这个解决方案:

function Car()
{
    var self = this;

    self.onOpenDoor = new ko.subscribable();

    self.openDoor = function()
    {
        self.onOpenDoor.notifySubscribers();
    }
}

1 个答案:

答案 0 :(得分:2)

更新如果您只是想要明确,可以使用notifySubscribers代替valueHasMutated。您可能想要查看observables的基本类型ko.subscribable

我会这样做:

var vm = {
    ///...definitions...
    openCount: ko.observable(0),
    openDoor: function () {
        vm.openCount(vm.openCount()+1);
    }
};

vm.openCount.subscribe(function () {
    ///...do something
});

vm.openCount.subscribe(function () {
    ///...do something else
});

ko.applyBindings(vm);

演示http://jsfiddle.net/uoqdfhdb/2/