是否有可能在Knockout中更改订阅的范围?
我有这样的事情:
element =
{
type: ko.observable()
name: ko.observable()
content: ko.observable()
}
element.type.subscribe(this._typeChanged.bind(element))
基本上我想要访问我订阅的属性对象。像我的代码中绑定一样,因为它绑定到整个VeiwModel而不是对象。
答案 0 :(得分:5)
也许淘汰赛处理当你订阅一个observable时你可以传递2个参数,第一个参数是 回调 ,第二个是 范围/上下文 ,尝试这样的事情:
element.type.subscribe(this._typeChanged, element)
subscribe函数接受三个参数:callback是在通知发生时调用的函数,target(可选)在回调函数中定义this的值,以及event(可选;默认为“change”)是接收通知的事件的名称。
答案 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 gitbhub中knockout/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个参数,而不是一个。