이전 답변은 정확하지만 종종 사용자 지정 바인딩 (권한을 확인하거나 다른 것을 기반으로 수행 할 작업을 결정하는 함수 등)에 함수를 전달합니다. 내가 정말로 필요한 것은 관찰 가능하지 않더라도 모든 함수를 풀기위한 것이었다.
다음은 모든 것을 재귀 적으로 풉니 다.
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.toJS(yourObject)
사용 하는 것보다를 사용 하는 것이 좋습니다ko.utils.unwrapObservable
. 일반적으로ko.utils.unwrapObservable
관찰 가능 항목과 관찰 불가능 항목을 지원하는 데 사용하는 것이 가장 안전합니다 .