淘汰订阅范围

时间:2015-11-26 16:51:12

标签: javascript knockout.js binding observable subscribe

是否有可能在Knockout中更改订阅的范围?

我有这样的事情:

element =
    {
        type: ko.observable()
        name: ko.observable()
        content: ko.observable()
    }

element.type.subscribe(this._typeChanged.bind(element))

基本上我想要访问我订阅的属性对象。像我的代码中绑定一样,因为它绑定到整个VeiwModel而不是对象。

3 个答案:

答案 0 :(得分:5)

也许淘汰赛处理当你订阅一个observable时你可以传递2个参数,第一个参数是 回调 ,第二个是 范围/上下文 ,尝试这样的事情:

element.type.subscribe(this._typeChanged, element)

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

参考。 http://knockoutjs.com/documentation/observables.html

答案 1 :(得分:0)

问题在于您创建视图模型的方式。视图模型是自包含的,包括对其进行操作的功能。它应该是这样的:

var ViewModel = function() {
    var self = this;
    self.type = ko.observable();
    self.name = ko.observable();
    self.content = ko.observable();
    self.type.subscribe(function(newVal) {
        // here you have access to all the viewmodel properties through self
    });
    return self;
};

这是一个使用var self=this;模式的构造函数。要使用您需要实例化的视图模型,即var vm = new ViewModel()。 (您可以省略new)。

当然,您也可以定义一个函数,并将其绑定到self,或者在构造函数中接收回调,并将其绑定到self。在这种情况下,函数实现将通过this访问视图模型,而不是self,这将在函数体内未定义。

var doSomethignWithVm = function(newVal) {
    // acces viewmodel via this
    // you can also use newVal
};

您修改构造函数以将其作为回调接收:

var ViewModel = function(doSomethingCallback) {
    self.type.subscribe(callback.bind(self));
};

这种模式没有多大意义,因为你的回调应该知道你的视图模型。在这种情况下,直接在模型中包含订阅功能更有意义。

修改的 注意:正如我在对Joel Ramos Michaliszen的回答中提到的那样,这两个代码都是等同的:

self.type.subscribe(callback.bind(self));
self.type.subscribe(callback.bind, self);

您可以在文件subscribable中查看knockout's gitbhubknockout/src/subscribales/subscribable.js的源代码来查看该内容。如果您寻找订阅实施,您会看到:

subscribe: function (callback, callbackTarget, event) {
    // ...
    boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback;

即。如果你提供第二个参数,它使用了将firt参数中传递的函数绑定到它。

答案 2 :(得分:-1)

虽然我知道我可能有错误的方法,但我也处于一个不能对应用程序进行任何重大更改的阶段。

我发现我可以用lodash来帮助我。 我最终使用部分函数将元素作为参数追加到订阅回调中:

element.type.subscribe(_.partial(this.typeChanged, element))

或在coffeescript中

element.type.subscribe $_.partial @typeChanged, element

现在,chartTypeChanged在输入上有2个参数,而不是一个。