首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候使用ko.utils.unwrapObservable?

什么时候使用ko.utils.unwrapObservable?
EN

Stack Overflow用户
提问于 2012-03-09 04:26:28
回答 2查看 68.1K关注 0票数 115

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-09 04:46:40

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

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

票数 144
EN

Stack Overflow用户

发布于 2012-03-24 05:04:04

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

下面的代码递归地展开所有内容:

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

希望这能帮助到一些人。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9624401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档