arb*_*arb 112 javascript knockout.js
我使用KnockoutJS编写了一些自定义绑定.我仍然不确定何时使用ko.utils.unwrapObservable(item)查看代码,该调用基本上检查是否item是可观察的.如果是,则返回值(),如果不是,则返回值.查看Knockout关于创建自定义绑定的部分,它们具有以下语法:
var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,他们调用observable via (),然后调用ko.utils.unwrapObservable.我只是试图了解何时使用一个与另一个或如果我应该始终遵循上述模式并使用两者.
RP *_*yer 140
ko.utils.unwrapObservable如果您不知道您是否获得了可观察量,您应该使用.这通常是在自定义绑定中,可观察或不可观察的绑定可以绑定它.
在上面的代码中,调用valueAccessor()实际上并没有展开observable.它只是检索在正确的上下文中传递给绑定的值(它被包装在一个函数中以保护它).返回值valueAccessor()可以是可观察的或不可观察的.它是传递给绑定的任何东西.
pil*_*ice 11
较早的答案是正确的,但我经常将函数传递给自定义绑定(一种检查权限的函数,或根据其他内容确定要执行的操作等).我真正需要的是解开任何功能,即使它不是一个可观察的功能.
以下递归地解开一切:
ko.utils.unwrapFunction = function (func) {
if (typeof func != 'function') {
return func;
}
else {
return ko.utils.unwrapFunction(func());
}
};
Run Code Online (Sandbox Code Playgroud)
这是我写的一个简单自定义绑定的示例:
//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
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样,bindingValue总是包含一个值.如果我在一个observable中传入一个函数,一个observable,一个值或一个函数,我不需要担心.这将正确解开所有内容,直到它到达我想要的对象.
希望能帮助别人.