何时使用ko.utils.unwrapObservable?

我用KnockoutJS写了一些自定义绑定。 我仍然不确定何时使用ko.util.unwrapObservable(item)查看代码,该调用基本上检查是否item是可观察的。 如果是,则返回值(),如果不是,则返回值。 看看有关创build自定义绑定的Knockout部分,它们具有以下语法:

 var value = valueAccessor(), allBindings = allBindingsAccessor(); var valueUnwrapped = ko.utils.unwrapObservable(value); 

在这种情况下,它们通过()调用observable,但也调用ko.utils.unwrapObservable 。 我只是想弄清楚什么时候使用一种模式,或者如果我应该总是遵循上面的模式并使用它们。

如果你不知道你是否被赋予了一个observable,你应该使用ko.utils.unwrapObservable 。 这通常会在可观察或不可观察的情况下与其绑定的自定义绑定中。

在上面的代码中,对valueAccessor()的调用实际上并不包含可观察对象。 它只是检索正确的上下文中传递给绑定的值(它被包装在一个函数中以保护它)。 valueAccessor()的返回值可能是可观察或不可观察的。 无论传递给绑定的是什么。

前面的答案是正确的,但是我经常把函数传递给自定义绑定(一个检查权限的函数,或者根据别的东西确定要做什么等)。 我真正需要的是打开任何function,即使它不是一个可观察的。

以下recursion解开一切:

 ko.utils.unwrapFunction = function (func) { if (typeof func != 'function') { return func; } else { return ko.utils.unwrapFunction(func()); } }; 

这里是我写的一个简单的自定义绑定的例子:

 //replaces single and double 'smart' quotes users commonly paste in from word into textareas and textboxes with normal text equivalents //USAGE: //data-bind="replaceWordChars:true //also works with valueUpdate:'keyup' if you want" ko.bindingHandlers.replaceWordChars = { update: function (element, valueAccessor, allBindingsAccessor, viewModel) { var bindingValue = ko.utils.unwrapFunction(valueAccessor); if (bindingValue) { $(element).val(removeMSWordChars(allBindingsAccessor().value())); //update DOM - not sure why I should need to do this, but just updating viewModel doesn't always update DOM correctly for me allBindingsAccessor().value($(element).val()); //update viewModel } } } 

这种方式bindingValue总是包含一个值。 我不需要担心,如果我传递了一个函数,一个observable,一个值,甚至一个函数在一个可观察的内部。 这将正确地解开所有东西,直到它到达我想要的对象。

希望能帮助别人。