何时使用 ko.utils.unwrapObservable?

2022-08-30 05:22:54

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

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

在这种情况下,它们调用可观察的 via,但随后也调用 。我只是试图弄清楚何时使用一个与另一个,或者我是否应该始终遵循上述模式并使用两者。()ko.utils.unwrapObservable


答案 1

您应该在您不知道是否被给予可观察性的情况下使用。这通常存在于自定义绑定中,其中可观察或不可观察对象可以绑定到它。ko.utils.unwrapObservable

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


答案 2

前面的答案是正确的,但我经常将函数传递给自定义绑定(检查权限或根据其他内容确定要执行的操作的函数等)。我真正需要的是解开任何函数的包装,即使它不是一个可观察的。

以下以递归方式解开所有内容:

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
        }
    }
}

这样,绑定值始终包含一个值。我不需要担心我是否在可观察量中传递了函数,可观察量,值甚至函数。这将正确打开所有内容,直到它到达我想要的对象。

希望能帮助别人。