如何在Knockout中找到调用订阅方法的属性?

时间:2012-05-17 15:21:05

标签: jquery knockout.js

当我们将一个函数订阅到多个属性时,是否有任何方法可以找到调用订阅函数的属性?

代码示例。

var self = this;
$(document).ready(function(){

var myViewModel = 
{
    FirstName : ko.observable("Bert"),
    LastName : ko.observable("pual")
};
myViewModel.FirstName.subscribe(self.notifyChange);

myViewModel.LastName.subscribe(self.notifyChange);

ko.applyBindings(myViewModel);
});
notifyChange = function ( newValue ) {// want to find which property(FirstName/LastName) is calling the function }

HTML

<body>
Enter your name:
<input id="source" data-bind="value: FirstName" />
<input id="Text1" data-bind="value: LastName" />    

这里我订阅了FirstName和LastName的“notifyChange”函数。如果任何一个值被更改意味着,它将调用notifyChange函数,我想知道哪些属性更改使notifyChange函数调用?

2 个答案:

答案 0 :(得分:2)

您无法分辨谁实际调用了该功能。

一种选择是使用您的notifyChange函数,但bind在每种情况下使用相应的属性。现在,this将设置为FirstNameLastName可观察对象。执行bind确实会为函数创建一个包装器,但至少您在notifyChange中的实际实现只会存在一次。

myViewModel.FirstName.subscribe(self.notifyChange.bind(myViewModel.FirstName));
myViewModel.LastName.subscribe(self.notifyChange.bind(myViewModel.LastName));

因此,this内的notifyChange将是适当的可观察对象。

答案 1 :(得分:0)

我意识到这个问题是在6年前提出并回答的。但是也许我的回答对某人仍然有用。

可接受的答案基于将observable作为回调函数的上下文传递。 顺便说一下,您不必使用bind(),可以将上下文作为第二个参数传递给subscribe()

myViewModel.FirstName.subscribe(self.notifyChange, myViewModel.FirstName);

淘汰赛在内部使用bind()

但是,如果您(像我一样)无力更改回调函数中的上下文(我需要该上下文中的属性和函数),为什么不简单地将回调函数包装到另一个函数中并传递一个额外的参数到回调函数:

myViewModel.FirstName.subscribe(function (value) { self.notifyChange('FirstName', value); });
myViewModel.LastName.subscribe(function (value) { self.notifyChange('LastName', value); });

如果您在循环中使用它,比如说您要枚举ViewModel的属性,则可以将整个内容包装在IIFE中,如下所示:

// .. property is an enumerated reference to an ko.observer
// .. propertyName is a string identifying it (for instance 'FirstName')
(function (elementName) {
    property.subscribe(function(value) { 
        self.notifyChange(elementName, value);
    });
})(propertyName);