Javascript 何时使用ko.utils.unwrapObservable?

Javascript 何时使用ko.utils.unwrapObservable?,javascript,knockout.js,Javascript,Knockout.js,我已经使用KnockoutJS编写了一些自定义绑定。我仍然不确定何时使用ko.utils.unwrapobbservable(item)查看代码,该调用基本上检查item是否是可观察的。如果是,则返回值(),如果不是,则只返回值。查看关于创建自定义绑定的Knockout部分,它们具有以下语法: var value = valueAccessor(), allBindings = allBindingsAccessor(); var valueUnwrapped = ko.utils.unwrap

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

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

在这种情况下,它们通过
()
调用observable,然后还调用
ko.utils.unwrapObservable
。我只是想弄清楚什么时候应该使用一个或另一个,或者我是否应该始终遵循上述模式并同时使用两者。

如果你不知道自己是否得到了可观察的结果,你应该使用
ko.utils.unwrapObservable
。这通常是在一个定制绑定中,一个可观察或不可观察的对象可以与之绑定


在上面的代码中,对
valueAccessor()
的调用实际上并没有展开可观察对象。它只是在正确的上下文中检索传递给绑定的值(它被包装在一个函数中以保护它)。
valueAccessor()
的返回值可能是可观察的,也可能不是。它是传递给绑定的任何内容。

前面的答案是正确的,但我通常会将函数传递给自定义绑定(一个检查权限或根据其他内容确定要做什么的函数,等等)。我真正需要的是打开任何函数,即使它不是可观察的

以下内容递归地展开所有内容:

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总是包含一个值。我不需要担心我是否传入了一个函数、一个可观测值、一个值,甚至是一个可观测值中的函数。这将正确地打开所有东西,直到它到达我想要的对象


希望这对某人有所帮助。

这要视情况而定。一些自定义绑定被设计为只处理可观察对象,因此您可以预先检查(ko.isObservable)它是否是可观察对象,然后可以使用()自由地展开它。如果您正在接收一个可能具有嵌套可观察对象的对象,那么如果您试图将对象的未包装版本传递到小部件或第三方库中,最好使用
ko.toJS(您的对象)
,而不是使用
ko.utils.unwrapObservable
。一般来说,使用
ko.utils.unwrapObservable
来支持可观察和不可观察是最安全的。我想我不明白
ko.utils.unwrapObservable
的目的是什么。查看代码,它只是检查它是否是可观察的,如果是,Knockout调用
()
获取可观察的值,否则,它只返回不可观察的值。如果我感兴趣的只是传递到绑定中的数据的值,为什么我不能总是使用
()
?您不知道在绑定中传递的是可观察的还是不可观察的。假设我有
myBinding
,有人绑定了ie,比如
data bind=“myBinding:myValue”
myValue
可能是可观察的,也可能只是视图模型上的普通属性。如果它只是一个属性,我像调用函数一样调用它,那么您将得到一个错误
ko.utils.unwrapObservable
将安全地返回值,无论是否传递了可观察值。我还建议使用“ko.unwrap”速记,因为“ko.utils.unwrapObservable”是一个非常长的表达式。@IvanNikitin-当然,只是想指出
ko.unwrap
在3.0+中可用。如果您使用的是早于3.0的版本,则仍然存在
ko.utils.unwrapObservable