何时使用 ko.utils.unwrapable?

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

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

在这种情况下,它们通过 ()调用可观察到的,但随后也调用 ko.utils.unwrapObservable。我只是想弄清楚什么时候使用一种或者另一种,或者我是否应该总是遵循上面的模式,两种都使用。

69930 次浏览

你应该使用 ko.utils.unwrapObservable的情况下,你不知道如果你有一个可观察的或没有。这通常是在习惯约束中,可观察的或不可观察的可以对其进行约束。

In the code that you have above, the call to valueAccessor() is not actually unwrapping an observable. It is just retrieving the value that was passed to the binding in the correct context (it gets wrapped in a function to protect it). The return value of valueAccessor() may be an observable or not. It is whatever was passed to the binding.

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

以下是递归展开所有东西:

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 总是包含一个值。我不需要担心我是否传递了一个函数,一个可观察的,一个值,或者甚至一个函数在一个可观察的内部。这将正确地展开所有内容,直到它到达我想要的对象。

Hope that helps someone.