Knockout.js事件上下文

时间:2012-06-02 10:24:04

标签: javascript knockout.js

我开始用knockout.js重新实现一些js代码。 我有一个包含一些函数的单例:

Dps = {
    someFunction: function() {
        this.anotherFunction();
    },
    anotherFunction: function() {
        console.log('tehee');
    }
}

现在还有一些绑定调用这个单例的函数:

<input type="text" data-bind="event: { change: Dps.someFunction }" />

令人讨厌的是,被调用函数中的上下文是事件,因此我无法调用this.anotherFunction()

有没有一种很好的方法可以摆脱这种情况?

PS:我知道我可以做一些类似Dps.someFunction()的事情,但在我看来这并不好。

2 个答案:

答案 0 :(得分:1)

data-bind="event: { change: Dps.someFunction.bind(Dps) }"

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

答案 1 :(得分:1)

您的功能表现为“静态”

所以要么你必须做Dps.anotherFunction,但你不想要那个,但我不明白为什么tbh。

您也可以调用 ko.applyBindings(Dps),然后您的代码就能正常运行。但是我猜这不是你想要的。可能你有另一个viewmodel,不是吗?

另一种解决方案是将Dps转换为您实例化的函数

关于jsfiddle:http://jsfiddle.net/PrbqZ/

<input type="text" data-bind="event: { change: myDps.someFunction }" />

var Dps = function() {
    var self = this;
    this.someFunction = function() {
        self.anotherFunction();
    };

    this.anotherFunction = function() {
        console.log('tehee');
    };
}

var myDps = new Dps();

//normally use dom ready, just simulating here
setTimeout(function(){
    ko.applyBindings();
}, 500)